Infragistics LineSeries二级系列与图例不显示问题求解
问题描述
我有一个包含3列的DataTable,希望在Ultra Data Chart中展示对应不同INST_ID的系列数据及图例。但INST_ID的数量不固定,可能存在5个不同的取值。当前仅显示了一组数据,图例也未正常显示,附上当前效果截图及实现代码,请问如何实现展示所有INST_ID对应的系列及图例?
当前效果截图:
实现代码:
private void Form1_Load(object sender, EventArgs e) { dtLineTest.Columns.Add("SAMPLE_TIME",typeof(DateTime)); dtLineTest.Columns.Add("INST_ID", typeof(Int32)); dtLineTest.Columns.Add("VALUE", typeof(Int32)); dtLineTest.Rows.Add(DateTime.Now,1,14); dtLineTest.Rows.Add(DateTime.Now.AddMinutes(-1), 1, 18); dtLineTest.Rows.Add(DateTime.Now.AddMinutes(-2), 1, 11); dtLineTest.Rows.Add(DateTime.Now.AddMinutes(-3), 1, 7); dtLineTest.Rows.Add(DateTime.Now.AddMinutes(-4), 1, 21); dtLineTest.Rows.Add(DateTime.Now, 2, 16); dtLineTest.Rows.Add(DateTime.Now.AddMinutes(-1), 2, 3); dtLineTest.Rows.Add(DateTime.Now.AddMinutes(-2), 2, 5); dtLineTest.Rows.Add(DateTime.Now.AddMinutes(-3), 2, 12); dtLineTest.Rows.Add(DateTime.Now.AddMinutes(-4), 2, 13); var xAxis = new CategoryXAxis(); var yAxis = new NumericYAxis(); xAxis.DataSource = dtLineTest; xAxis.Label = "SAMPLE_TIME"; var legend = new UltraLegend(); var lineSeries = new LineSeries(); lineSeries.DataSource = dtLineTest; lineSeries.ValueMemberPath = "VALUE"; lineSeries.Title = "INST_ID"; lineSeries.XAxis = xAxis; lineSeries.YAxis = yAxis; lineSeries.Legend = legend; ultraDataChart1.Axes.Add(xAxis); ultraDataChart1.Axes.Add(yAxis); ultraDataChart1.Series.Add(lineSeries); }
解决方案
问题核心是仅创建了单个LineSeries,未按INST_ID分组生成对应数据系列,同时图例未添加到图表控件中。按以下方式修改即可:
按INST_ID分组获取独立数据源
从DataTable中提取所有唯一的INST_ID,为每个ID单独筛选对应的数据行,作为该系列的专属数据源。为每个分组创建LineSeries
遍历每个INST_ID,创建对应的LineSeries,配置好数据源、值字段、标识性标题,并关联坐标轴和图例。将图例添加到图表控件
创建UltraLegend后,必须将其加入ultraDataChart1.Legends集合,否则图例无法显示。
修改后的完整代码:
private void Form1_Load(object sender, EventArgs e) { dtLineTest.Columns.Add("SAMPLE_TIME",typeof(DateTime)); dtLineTest.Columns.Add("INST_ID", typeof(Int32)); dtLineTest.Columns.Add("VALUE", typeof(Int32)); dtLineTest.Rows.Add(DateTime.Now,1,14); dtLineTest.Rows.Add(DateTime.Now.AddMinutes(-1), 1, 18); dtLineTest.Rows.Add(DateTime.Now.AddMinutes(-2), 1, 11); dtLineTest.Rows.Add(DateTime.Now.AddMinutes(-3), 1, 7); dtLineTest.Rows.Add(DateTime.Now.AddMinutes(-4), 1, 21); dtLineTest.Rows.Add(DateTime.Now, 2, 16); dtLineTest.Rows.Add(DateTime.Now.AddMinutes(-1), 2, 3); dtLineTest.Rows.Add(DateTime.Now.AddMinutes(-2), 2, 5); dtLineTest.Rows.Add(DateTime.Now.AddMinutes(-3), 2, 12); dtLineTest.Rows.Add(DateTime.Now.AddMinutes(-4), 2, 13); var xAxis = new CategoryXAxis(); var yAxis = new NumericYAxis(); xAxis.DataSource = dtLineTest; xAxis.Label = "SAMPLE_TIME"; // 创建图例并添加到图表 var legend = new UltraLegend(); ultraDataChart1.Legends.Add(legend); // 获取所有唯一的INST_ID var uniqueInstIds = dtLineTest.AsEnumerable() .Select(row => row.Field<int>("INST_ID")) .Distinct() .ToList(); // 为每个INST_ID创建系列 foreach (var instId in uniqueInstIds) { // 筛选当前INST_ID的数据 var filteredData = dtLineTest.AsEnumerable() .Where(row => row.Field<int>("INST_ID") == instId) .CopyToDataTable(); var lineSeries = new LineSeries(); lineSeries.DataSource = filteredData; lineSeries.ValueMemberPath = "VALUE"; lineSeries.Title = $"INST_ID_{instId}"; // 标题用INST_ID标识,图例中会显示 lineSeries.XAxis = xAxis; lineSeries.YAxis = yAxis; lineSeries.Legend = legend; ultraDataChart1.Series.Add(lineSeries); } ultraDataChart1.Axes.Add(xAxis); ultraDataChart1.Axes.Add(yAxis); }
关键说明
- 分组筛选数据:通过LINQ提取唯一
INST_ID并筛选对应数据,确保每个系列只展示对应ID的数值。 - 动态创建系列:遍历每个ID生成
LineSeries,不管INST_ID数量多少,都会自动生成对应数据系列。 - 图例显示:将
UltraLegend加入图表的Legends集合,每个系列关联该图例后,图例会自动显示各系列的标识标题。
内容的提问来源于stack exchange,提问作者agubugu
相关产品推荐
相关产品推荐

