c#devexpress图表如何获取数据

c# devexpress chart how to get data

我想用代码填充数据库中的图表。(请不要建议我选择图表并单击添加数据源)我已经尝试了一些 codes.but 我无法收到任何值和任何 data.here是代码;

public DataTable Rating() {
        SqlConnection conn = new SqlConnection("Data Source=MEVLUT\SQLEXPRESS;Initial Catalog=Chart;Integrated Security=True");
        SqlDataAdapter da = new SqlDataAdapter("Select * from ChannelRatings", conn);
        DataTable ds = new DataTable();
        conn.Open();
        da.Fill(ds);
        return ds;
    }
    private void frmMain_Load(object sender, EventArgs e) {
        ChartControl ch = chartcontrolRatings;
        Series series = new Series("Ratings",ViewType.Bar);
        ch.Series.Add(series);
        series.DataSource = Rating();
        this.Controls.Add(ch);
    }

2 列 ChannelName 和 RatingValue 并且它们具有值。

首先想到的是ExecuteReader没有执行。我会post一些例子

SqlCommand cmd = new SqlCommand();
cmd.CommandTimeout = 600;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "Select * from ChannelRatings";
cmd.Connection = dbConnection;
    SqlDataReader dr= null;
    using (dr= cmd.ExecuteReader())
    {
          DataTable dtData = new DataTable(storedProcedureName);
          //First create Columns for new DataTable
          object[] values = new object[dr.FieldCount];
          Type[] columnTypes = new Type[dr.FieldCount];
          for (int i = 0; i < dr.FieldCount; i++)
          {
            Type columnType = dr.GetFieldType(i);
            string columnName = dr.GetName(i);
            if (columnType != null)
            {
              dtData.Columns.Add(columnName, columnType);
              columnTypes[i] = columnType;
            }
          }
          t1 = DateTime.Now.Subtract(d1);
          while (dr.Read())
          {//Fill DataTable by reading values by type...
            int columnsRead = dr.GetValues(values);
            DataRow newRow = dtData.NewRow();
            for (int i = 0; i < dtData.Columns.Count; i++)
            {
              if (columnTypes[i].Name == "Int32") newRow[i] = values[i] != null && values[i] != DBNull.Value ? Convert.ToInt32(values[i]) : Base.BussinesLayer.Utils.Int32NullValue;
              else if (columnTypes[i].Name == "Int16") newRow[i] = values[i] != null && values[i] != DBNull.Value ? Convert.ToInt16(values[i]) : Base.BussinesLayer.Utils.Int16NullValue;
              else if (columnTypes[i].Name == "String") newRow[i] = values[i] != null && values[i] != DBNull.Value ? Convert.ToString(values[i]) : Base.BussinesLayer.Utils.StringNullValue;
              else if (columnTypes[i].Name == "Decimal") newRow[i] = values[i] != null && values[i] != DBNull.Value ? Convert.ToDecimal(values[i]) : Base.BussinesLayer.Utils.DecimalNullValue;
              else if (columnTypes[i].Name == "DateTime") newRow[i] = values[i] != null && values[i] != DBNull.Value ? Convert.ToDateTime(values[i]) : Base.BussinesLayer.Utils.DateTimeNullValue;
              else if (columnTypes[i].Name == "TimeSpan") newRow[i] = values[i] != null && values[i] != DBNull.Value ? EvotechUtils.ConvertToTimeSpan(values[i]) : Base.BussinesLayer.Utils.DateTimeNullValue.TimeOfDay;
              else if (columnTypes[i].Name == "Int64") newRow[i] = values[i] != null && values[i] != DBNull.Value ? Convert.ToInt64(values[i]) : Base.BussinesLayer.Utils.Int64NullValue;
              else if (columnTypes[i].Name == "Float") newRow[i] = values[i] != null && values[i] != DBNull.Value ? Convert.ToInt64(values[i]) : Base.BussinesLayer.Utils.FloatNullValue;
              else if (columnTypes[i].Name == "Double") newRow[i] = values[i] != null && values[i] != DBNull.Value ? Convert.ToInt64(values[i]) : Base.BussinesLayer.Utils.DoubleNullValue;
              else if (columnTypes[i].Name == "Byte") newRow[i] = values[i] != null && values[i] != DBNull.Value ? Convert.ToInt64(values[i]) : Base.BussinesLayer.Utils.ByteNullValue;
              else newRow[i] = DBNull.Value;
            }
            dtData.Rows.Add(newRow);
          }
          dr.Close();                                   
    }

图表示例:

        chcGraph.BeginInit();
        chcGraph.BackColor = System.Drawing.Color.Transparent;          
        chcGraph.Series.Add("GraphSeriesMain", ViewType.Pie);
        chcGraph.Series.Swap(chcGraph.Series[0], chcGraph.Series["GraphSeriesMain"]);
        chcGraph.Series["GraphSeriesMain"].DataSource = dataTableData;
        chcGraph.Series["GraphSeriesMain"].ArgumentDataMember = "ChannelName";
        chcGraph.Series["GraphSeriesMain"].ArgumentScaleType = ScaleType.Qualitative;
        chcGraph.Series["GraphSeriesMain"].ValueDataMembers.AddRange(new string[] { "RatingValue" });
        chcGraph.EndInit();
        chcGraph.Refresh();

完成此操作的一种方法是将数据绑定到数据透视表,然后将数据透视表绑定到图表。在您的图表的 BindingSource 中,您实际上 select 下拉菜单并选择 Pivot Grid。

这样做的好处是允许您在设计时(甚至 运行 时)使用数据透视表来根据您的喜好修改图表。

您使用此组件的 Winforms 或 WPF 版本吗?

我只体验过 WPF 版本,我不确定 WinFormas 版本有多少不同。

但在 WPF 版本中,我必须设置我的系列(模板)的值 ArgumentDataMemberValueDataMember 以指定我的 DataTable 的哪些列包含参数和值数据。

因此,如果是 WPF 图表,则必须添加如下内容:

series.ArgumentDataMember = "ChanelName";
series.ValueDataMember = "Rating";

问候