zoukankan      html  css  js  c++  java
  • silverlight之图表控件应用

      快过年了,工作不怎么忙,闲来无事,把BI中客户端显示用silverlight图表实现了一下,思路还是老一套,ado.net读取数据,wcf推送数据,silverlight显示。

    不废话,晒解决方案

    为了最大化减少数据的传输量,我们采取服务端集中抓取数据,然后客户端用linq实现数据筛选,重新定义显示实体类,实现数据绑定

    服务端同样新建一个实体类,根据返回的数据集合

      // 使用下面示例中说明的数据约定将复合类型添加到服务操作。
    [DataContract]
    public class ProjectDistributed
    {
    [DataMember]
    public int proj_unid { set; get; }
    [DataMember]
    public string projid { set; get; }

    [DataMember]
    public string cname { set; get; }
    [DataMember]
    public string projstatus { set; get; }
    [DataMember]
    public string projtype { set; get; }

    [DataMember]
    public int projtypecount { get; set; }
    [DataMember]
    public int Days { set; get; }
    [DataMember]
    public int functionnum { set; get; }
    [DataMember]
    public int realworkload { set; get; }

    }

    新建服务契约,并实现:

     [ServiceContract]
    public interface IService1
    {
    [OperationContract]
    List<ProjectDistributed> GetData(int value);
    }
    namespace WcfService1
    {
    // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“Service1”。
    public class Service1 : IService1
    {
    public List<ProjectDistributed> GetData(int value)
    {
    StringBuilder sqlString = new StringBuilder();

    sqlString.Append(" select proj_unid,projid,cname,projstatus,projtype,Days,functionnum,realworkload as realworkload from Func_GetProjectDistributed('2006/1/1', GETDATE()) where dept_unid in ( select dept_unid from View_DepartmentName) and projtype in (select projtype from View_ProjectType) and projstatus in ( select projstatus from View_ProjectStatus )");
    List<ProjectDistributed> myCL = null;
    ProjectDistributed myOnePro = null;
    using (SqlDataReader SDR = SqlHelper.ExecuteReader(SqlHelper.ConnectionString, CommandType.Text, sqlString.ToString()))
    {
    myCL = new List<ProjectDistributed>();
    while (SDR.Read())
    {
    myOnePro = new ProjectDistributed();
    myOnePro.projid = SDR["projid"].ToString();
    myOnePro.cname = SDR["cname"].ToString();
    myOnePro.Days = Convert.ToInt32(SDR["Days"].ToString());
    myOnePro.functionnum = Convert.ToInt32(SDR["functionnum"].ToString());
    myOnePro.proj_unid = Convert.ToInt32(SDR["proj_unid"].ToString());
    myOnePro.projstatus = SDR["proj_unid"].ToString();
    myOnePro.realworkload = Convert.ToInt32(SDR["realworkload"].ToString());
    myOnePro.projtype = SDR["projtype"].ToString();
    //myOnePro.projtypecount = Convert.ToInt32(SDR["projtypecount"]);
    myCL.Add(myOnePro);

    }
    }
    return myCL;

    }
    }
    }

    公开服务,本来我本打算采用tcp协议传输的,优点不用说,但是调试了半天没通过,最后采用http协议,这个简单,记住加跨域文件,自定义binging实现数据量的增加:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
    <connectionStrings>
    <add name="DataConnectionString" connectionString="Data Source=WUXUELEI\MSSQLSERVER2008;Initial Catalog=kmswork;User ID=sa;Password=wuxuelei" providerName="System.Data.SqlClient"/>
    </connectionStrings>
    <system.web>
    <compilation debug="true" targetFramework="4.0" />
    </system.web>
    <system.serviceModel>

    <services>
    <service behaviorConfiguration="mybehavior" name="WcfService1.Service1">
    <host>
    <baseAddresses>
    <add baseAddress="http://localhost:8732/Design_Time_Addresses/WcfServiceLibrary1/Service1/"/>
    </baseAddresses>
    </host>
    <!-- Service Endpoints -->
    <!-- 除非完全限定,否则地址将与上面提供的基址相关 -->
    <endpoint address="" bindingConfiguration="higherMessageSize" binding="basicHttpBinding" contract="WcfService1.IService1">

    <!--
    部署时,应删除或替换下列标识元素,以反映
    用来运行所部署服务的标识。删除之后,WCF 将
    自动推断相应标识。
    -->
    <identity>
    <dns value="localhost"/>
    </identity>
    </endpoint>
    <!-- Metadata Endpoints -->
    <!-- 元数据交换终结点供相应的服务用于向客户端做自我介绍。 -->
    <!-- 此终结点不使用安全绑定,应在部署前确保其安全或将其删除-->
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
    </service>
    </services>
    <behaviors>
    <serviceBehaviors>
    <behavior name="mybehavior">
    <!-- 为避免泄漏元数据信息,
    请在部署前将以下值设置为 false 并删除上面的元数据终结点 -->
    <serviceMetadata httpGetEnabled="true"/>
    <!-- 要接收故障异常详细信息以进行调试,
    请将以下值设置为 true。在部署前设置为 false
    以避免泄漏异常信息-->
    <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>
    </serviceBehaviors>
    </behaviors>
    <bindings>
    <basicHttpBinding>
    <binding name="higherMessageSize"
    maxBufferSize="2147483647"
    maxBufferPoolSize="2147483647"
    maxReceivedMessageSize="2147483647"/>
    </basicHttpBinding>
    </bindings>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    </system.serviceModel>
    <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    </system.webServer>

    </configuration>

    客户端很简单,拖上控件,后台读取数据显示就行,记住先添加服务引用,生成客户端代码类:

     <Grid x:Name="LayoutRoot" Background="White">
    <toolkit:Chart HorizontalAlignment="Left" Margin="37,36,0,0" Name="Mychart" Title="中心类型项目分布" VerticalAlignment="Top" Height="352" Width="427">
    </toolkit:Chart>
    </Grid>
      void client_GetDataCompleted(object sender, MyService.GetDataCompletedEventArgs e)
    {
    if (e.Error == null)
    {
    List<ProjectDistributed> myResult = e.Result.ToList<ProjectDistributed>();
    myAxis axis = new myAxis()
    {
    FontStyle = FontStyles.Normal,
    FontSize = 12f
    };
    PieSeries series = new PieSeries();
    System.Collections.Generic.IEnumerable<Model> mySource = new List<Model>();
    mySource = from p in myResult
    group p by p.projtype
    into g
    select new Model
    {
    projtype = g.Key,
    projtypecount = g.Count()
    };
    //myResult = myResult.GroupBy(p => p.projtype).
    // Select
    // (k => new Model
    // {
    // projtype = k.Key,
    // projtypecount = k.Count()
    // });

    series.ItemsSource = mySource;
    series.IndependentValueBinding = new System.Windows.Data.Binding("projtype");
    series.DependentValueBinding = new System.Windows.Data.Binding("projtypecount");
    series.AnimationSequence = AnimationSequence.LastToFirst;
    Mychart.Series.Add(series);
    }
    else
    MessageBox.Show(e.Error.ToString());
    }

    挺简单的一个实例,主要是思路,权作自己笔记只用,晒下结果,我们采用OOB模式:

    呵呵..就到这里,上传下源码

  • 相关阅读:
    委托(2).net 1.x中的委托
    委托(1)认识委托
    克隆对象的几种方法
    常用的去重和排序
    为更好地设计数据库,重新整理sql server数据类型
    对于数据库中表示状态或类型字段表示方法的思考
    string to byte[]
    json序列化时datetime的处理方法
    dll版本冲突的解决方法
    .net中的序列化
  • 原文地址:https://www.cnblogs.com/zhijianliutang/p/2325976.html
Copyright © 2011-2022 走看看