数据绑定是一个允许一个或多个数据使用者以同步的方式和一个数据提供者联接的过程。如果你编辑一个绑定数据集的一部分数值,联接到相同数据源的C1Chart控件将反映新的数据集。和许多绑定控件不同,C1Chart 并不使用当前值。当数据绑定时,图表使用所有的绑定数据
作为其数据源来定义系列数据,在图表的绘图区使用系列数据和其他的图表属性直接绘制出来。这个过程需要简单的几步,但是需要图表对象模型的一些知识。
首先,必须创建一个数据源,许多数据源都可用,包括 ADO.NET 数据源对象,例如,
DataTable, DataView, DataSet 和 DataViewManager。还有第三方的数据源,例如
ComponentOne DataObjects 组件,包括 C1ExpressTable, C1ExpressVew,
C1ExpressConnection, C1DataView, C1DataTableSource 和 C1DataSet 都可以被使用。关于创建 ADO.NET 数据源的详细信息,请参照.NET Framework 文档。
使用 ComponentOne DataObjects for .NET 的详细信息参照 ComponentOne Studio
for .NET 中的 ComponentOne DataObjects for .NET 文档。 下面章节介绍了怎样通过首先设定数据源,然后设定数据表单来给图表绑定数据。
给 C1Chart 绑定数据
给 C1Chart 绑定数据首先设定数据源,然后设定数据表单。
步骤 1:设定数据源一旦创建了一个正确的数据源,就可以设定 C1Chart.DataSource 属性,这些可以在设计时
做,也可以在运行时做。
在设计时设定 DataSource 属性你可以使用下面的任何一种方法在设计时设置 C1Chart.DataSource 属性:
C1Chart 属性窗口在 C1Chart 属性窗口设定 C1Chart.DataSource 属性:
- 在属性下拉列表中选择 C1Chart
- 然后从 C1Chart.DataSource 属性的下拉列表中选择一个值
图表向导
C1Chart.DataSource 属性也可以使用图表向导或者图表属性设计器来设定。
使用图表向导来设定 C1Chart.DataSource 属性,要完成下面几步:
- 在图表向导的步骤 3 中选择 Binding 选项卡。
- 在 Data source 下拉列表中选择一个值。
图表属性设计器
使用图表属性设计器设定 DataSource 属性,采用下面几步:
- 右键点击C1Chart 控件并选择Chart Properties来访问Chart Properties编辑器。
- 展开 Data 元素,选择 Binding.
- 在 Binding 选项卡中,从 Data source 下拉列表中选择一个值。
通过编程设定 DataSource 属性:
使用下面的代码将图表的 data source 属性设定为数据源对象:
Visual Basic
C1Chart1.DataSource = DataSet11
- C#
c1Chart1.DataSource = dataSet11;
步骤 2:设定数据表单
一旦 C1Chart DataSource 已经被设定了,就必须告诉 C1Chart 每个 ChartDataSeries 对应数据表的哪一列。换句话说,必须定义数据源哪一个列要用来定义 X 值,哪一列定义 Y 值,并且根据 ChartType,每个 ChartDataSeries 的 Y1,Y2,Y3 对应哪一列。
X 值,Y 值等等,是通过每一个 ChartDataSeries 的 ChartDataArray 对象拿的。这些对象都有一个 DataField 属性,这个属性用来定义数据源中数据列,提供给特定的 ChartDataArray。
DataField 属性可以在设计时设定,也可以在运行时设定。
使用设计器设定数据表
在设计时使用 Visual Studio .NET 属性窗口,浏览 ChartGroups, Group0, ChartData, 和
SeriesList,然后双击 ellipsis 按钮,打开 SeriesList。这样就打开了 ChartDataSeries Collection Editor。选择第一个系列,切换到X属性是一个ChartDataArray对象。展开X节点,选择DataField 属性,然后从它的下拉列表中选择一个可用属性。
DataField 也可以通过图表向导和图表属性设计器来设定。下面的图描述了在图表向导中,
X 下拉列表和 Y 下拉列表中的 DataField。
下面的图描述了在图表属性对话框中,X 下拉列表和 Y 下拉列表中的 DataField。
使用代码设定数据表格
运行时,每一个 ChartDataSeries 的每一个 ChartDataArray 对象的 DataField 属性都是可用的。注意 DataField 属性被设定为一个字符串的值,这个字符串的值标明了数据源列的名字。
- Visual Basic
C1Chart1.ChartGroups(0).ChartData.SeriesList(0).X.DataField = "QuickStop.ShippedDate"
C1Chart1.ChartGroups(0).ChartData.SeriesList(0).Y.DataField_ = "QuickStop.SaleAmount"
- C#
c1Chart1.ChartGroups[0].ChartData.SeriesList[0].X.DataField = "QuickStop.ShippedDate"; c1Chart1.ChartGroups[0].ChartData.SeriesList[0].Y.DataField = "QuickStop.SaleAmount";
请注意字符串的语法。在上面的编码例子中,QuickStop 是包含列的 TableName, ShippedDate 和 SaleAmount 是列的名字。TableName 是否要出现在字符串中由数据源自己所决定。在上面的例子中,一个由很多表的 DataSet 对象被作为了数据源使用,所以需要 TableName。如果在一个 DataSet 对象中,一个特定的表被用作为数据源,那么只需要使用列名。
直接绑定图表到数据源
在大多数的情况下,数据在绘制之前需要总结,所以在数据源和实际的图表之间有一个层。但是在一些情况下,你想要绘制的数据已经在一个 DataView 或者数据源对象中可用了,在这样的情况,你可以直接把图表绑定到数据源对象。
想要绑定一个 C1Chart 控件到一个数据源,你应该设定控件的 DataSource 属性为一个数据
源对象,例如一个 DataView 或者 DataTable。然后绑定单独的系列到数据源对象的列,这时可以使用 DataSeries.X.DataField 和 DataSeries.Y.DataField 属性。
使用图表向导,下面的步骤都能做到,但是如果你喜欢用编码实现,下面有一个例子阐明了
整个过程:
- Visual Basic
' DataBinding 只能在 1.0.20034.13244 及之后的版本中使用 |
C#
// DataBinding 只能在 1.0.20034.13244 及之后的版本中使用
//
// 获取 Chart 的数据
string sql = "select * from products"; string conn = @"provider=… nwind.mdb;";
OleDbDataAdapter da = new OleDbDataAdapter(sql, conn); da.Fill(dt);
//绑定数据源
c1chart.DataSource = dt;
// 清空 Chart 中现有的全部系列
ChartDataSeriesCollection dsc = c1chart.ChartGroups[0].ChartData.SeriesList; dsc.Clear();
// 添加 Unit price 系列
ChartDataSeries ds = dsc.AddNewSeries();
//ds.AutoEnumerate = true; // (in case you don't want to set the X values) ds.X.DataField = "ProductName"; ds.Y.DataField = "UnitPrice";
// 添加 Units in stock 系列 ds = dsc.AddNewSeries(); ds.X.DataField = "ProductName"; ds.Y.DataField = "UnitsInStock";
// 设置过滤排序等属性
dt.DefaultView.RowFilter = "CategoryID = 4";
上面的代码取回 NWind Products 表,然后创建了 2 个数据系列,每一个数据系列都绑定了数据源的一个列。
绑定表的最有趣的部分是它维护一个和数据源的动态联接。对数据源的任何改变包括值的变更,过滤,排序,新增或删除记录等等,都会自动的影响图表。使用数据绑定函数化编程
在下面的代码当增加一个带 C1Chart 控件的新的工程,到一个窗口中,展示了一个完整的使用数据绑定的函数化程序。请注意创建和操控 Form_Load 控件也是十分必要的。这个例子中使用的数据库是 Microsoft 提供和使用的 NorthWind 数据库,也是 ComponentOne Studio
for .NET 提供和使用的。如果文件的路径和你的安装路径不符,在执行程序之前,你必须修改数据库。
下面的例子完全使用编码操作数据库和 C1Chart。但是,使用 Microsoft .NET IDE 和它的属性表,在设计时就能完全的完成代码所完成的操作。请注意使用了两个 DataAdapters ,
DataAdapters 的 TableMapping 允许一个单独的 DataSet 作为 DataSource 使用,因此相同的表绘制了两个系列。Visual Basic
Private Sub BindMultipleSeriesViewsAndChartSetup(ByVal chart As C1.Win.C1Chart.C1Chart)
' 需要添加 System.Data.OleDb 命名空间
Dim connect As OleDbConnection = New OleDbConnection()
Dim adapt1 As OleDbDataAdapter = New OleDbDataAdapter()
Dim adapt2 As OleDbDataAdapter = New OleDbDataAdapter()
Dim select1 As OleDbCommand = New OleDbCommand()
Dim select2 As OleDbCommand = New OleDbCommand()
' 设置数据库连接字符串
connect.ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.4.0;" + _
"User ID=Admin;" + _
"Data Source=C:\Program Files\ComponentOne Studio.Net\common\NWIND.MDB;" + _ "Jet OLEDB:Engine Type=5;"
' 设置查询 SQL 语句
select1.CommandText = _
"SELECT SaleAmount, ShippedDate, CompanyName " + _
"FROM [Sales Totals by Amount] " + _
"WHERE (CompanyName = 'Save-a-lot Markets') " + _
"ORDER BY ShippedDate" select1.Connection = connect
'设置查询 SQL 语句
select2.CommandText = _
"SELECT SaleAmount, ShippedDate, CompanyName " + _
"FROM [Sales Totals by Amount] " + _
"WHERE (CompanyName = 'QUICK-Stop') " + _
"ORDER BY ShippedDate" select2.Connection = connect
' 需要为 Mapping 对象添加 System.Data.Common 命名空间 adapt1.SelectCommand = select1
Dim ColumnMaps_SaveALot As DataColumnMapping() = _
{ _New DataColumnMapping("SaleAmount", "SaleAmount"), _
New DataColumnMapping("CompanyName", "CompanyName"), _ New DataColumnMapping("ShippedDate", "ShippedDate") _
}
adapt1.TableMappings.Add(New DataTableMapping("Table", "SaveALot", _
ColumnMaps_SaveALot)) ' 设置 adapter, adapt2.
adapt2.SelectCommand = select2
Dim ColumnMaps_QuickStop As DataColumnMapping() = _
{ _
New DataColumnMapping("SaleAmount", "SaleAmount"), _
New DataColumnMapping("CompanyName", "CompanyName"), _ New DataColumnMapping("ShippedDate", "ShippedDate") _
}
adapt2.TableMappings.Add(New DataTableMapping("Table", "QuickStop", _
ColumnMaps_QuickStop))
' 创建 DataSet 并填充数据
Dim ds As DataSet = New DataSet() adapt1.Fill(ds) adapt2.Fill(ds)
' 为 chart 设置 DataSource,DataFields 以及其他属性 chart.Dock = DockStyle.Fill chart.DataSource = ds
Dim sc As ChartDataSeriesCollection = chart.ChartGroups(0).ChartData.SeriesList sc.RemoveAll()
' 添加 Save-A-Lot 系列.
Dim s As ChartDataSeries = sc.AddNewSeries() s.Label = "Save-A-Lot"
s.X.DataField = "SaveALot.ShippedDate"
s.Y.DataField = "SaveALot.SaleAmount"' 添加 Quick-Stop 系列.
s = sc.AddNewSeries()
s.Label = "Quick-Stop"
s.X.DataField = "QuickStop.ShippedDate"
s.Y.DataField = "QuickStop.SaleAmount"
' 设置坐标轴和图例区
chart.ChartArea.AxisX.AnnoFormat = FormatEnum.DateShort chart.ChartArea.AxisY.AnnoFormat = FormatEnum.NumericCurrency chart.ChartArea.AxisY.Min = 0
' 设置图表类型为 Bar
chart.ChartGroups[0].ChartType = Chart2DTypeEnum.Bar chart.ChartGroups[0].ShowOutline = false
' 设置图例区的显示属性
chart.Legend.Compass = CompassEnum.North chart.Legend.Orientation = LegendOrientationEnum.Horizontal chart.Legend.Visible = true
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles MyBase.Load
C1Chart1.Location = New Point(0)
C1Chart1.Size = Me.ClientSize
BindMultipleSeriesViewsAndChartSetup(C1Chart1)
End SubC#
private void BindMultipleSeriesViewsAndChartSetup(C1.Win.C1Chart.C1Chart chart) {
//需要添加 System.Data.OleDb 命名空间
OleDbConnection connect = new OleDbConnection();
OleDbDataAdapter adapt1 = new OleDbDataAdapter();
OleDbDataAdapter adapt2 = new OleDbDataAdapter();
OleDbCommand select1 = new OleDbCommand();
OleDbCommand select2 = new OleDbCommand();
//设置数据库连接字符串
connect.ConnectionString =
"Provider=Microsoft.Jet.OLEDB.4.0;" +
"User ID=Admin;" +
"Data Source=C:
Program Files
ComponentOne Studio.Net\\common
NWIND.MDB;" + "Jet OLEDB:Engine Type=5;";
//设置查询 SQL 语句
select1.CommandText =
"SELECT SaleAmount, ShippedDate, CompanyName " +
"FROM [Sales Totals by Amount] " +
"WHERE (CompanyName = \'Save-a-lot Markets\') " +
"ORDER BY ShippedDate"; select1.Connection = connect;
//设置查询 SQL 语句
select2.CommandText =
"SELECT SaleAmount, ShippedDate, CompanyName " +
"FROM [Sales Totals by Amount] " +
"WHERE (CompanyName = \'QUICK-Stop\') " +
"ORDER BY ShippedDate"; select2.Connection = connect;
//需要为 Mapping 对象添加 System.Data.Common 命名空间 adapt1.SelectCommand = select1;
DataColumnMapping [] ColumnMaps_SaveALot =
{
new DataColumnMapping("SaleAmount", "SaleAmount"), new DataColumnMapping("CompanyName", "CompanyName"),new DataColumnMapping("ShippedDate", "ShippedDate")
};
// 设置 adapter, adapt2.
adapt2.SelectCommand = select2;
DataColumnMapping [] ColumnMaps_QuickStop =
{
new DataColumnMapping("SaleAmount", "SaleAmount"), new DataColumnMapping("CompanyName", "CompanyName"), new DataColumnMapping("ShippedDate", "ShippedDate")
};
adapt2.TableMappings.Add(new DataTableMapping("Table", "QuickStop", ColumnMaps_QuickStop));
//创建 DataSet 并填充数据
DataSet ds = new DataSet(); adapt1.Fill(ds); adapt2.Fill(ds);
//为 chart 设置 DataSource,DataFields 以及其他属性 chart.Dock = DockStyle.Fill; chart.DataSource = ds;
ChartDataSeriesCollection sc = chart.ChartGroups[0].ChartData.SeriesList; sc.RemoveAll();
//添加 Save-A-Lot 系列.
ChartDataSeries s = sc.AddNewSeries(); s.Label = "Save-A-Lot";
s.X.DataField = "SaveALot.ShippedDate";
s.Y.DataField = "SaveALot.SaleAmount"; // 添加 Quick-Stop 系列. s = sc.AddNewSeries(); s.Label = "Quick-Stop";
s.X.DataField = "QuickStop.ShippedDate";
s.Y.DataField = "QuickStop.SaleAmount";
//设置坐标轴和图例区
chart.ChartArea.AxisX.AnnoFormat = FormatEnum.DateShort; chart.ChartArea.AxisY.AnnoFormat = FormatEnum.NumericCurrency; chart.ChartArea.AxisY.Min = 0;
//设置图表类型为 Bar
chart.ChartGroups[0].ChartType = Chart2DTypeEnum.Bar;
chart.ChartGroups[0].ShowOutline = false;
// 设置图例区的显示属性
chart.Legend.Compass = CompassEnum.North; chart.Legend.Orientation = LegendOrientationEnum.Horizontal; chart.Legend.Visible = true; chart.Legend.Visible = true;
}
private void Form1_Load(object sender, System.EventArgs e)
{ c1Chart1.Location = new Point(0); c1Chart1.Size = this.ClientSize;
BindMultipleSeriesViewsAndChartSetup(c1Chart1);
}