你好,我正在搜索一个图形,该图形将允许我制作Z线图控件。现在我有了X(付款日期)和Y(收集)线,如何制作Z(用户名)线 我希望每个用户名都单独一行
有人可以帮我吗?
我想在普通的C#win窗体应用程序上制作程序
SqlDataReader reader = sqlcomm.ExecuteReader();
DataTable sd = new DataTable();
sd.Load(reader);
dataGridView1.DataSource = sd;
reader.Close();
chart1.Series["collected"].XValueMember = "Payment_Date";
chart1.Series["collected"].XValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Date;
chart1.Series["collected"].YValueMembers = "collected";
chart1.Series["collected"].YValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Int32;
chart1.DataSource = sd;
chart1.DataBind();
答案 0 :(得分:3)
第一步:为您要绑定的每个元素创建一个单独的BindingSource
,并设置一个适当的Filter
,以便每个元素仅显示一个用户的数据。
第二步:显示和隐藏想要的系列。
我创建了一个包含3列的DataTable dt
:
dt.Columns.Add("User", typeof(string));
dt.Columns.Add("Date", typeof(DateTime));
dt.Columns.Add("Value", typeof(double));
并随机填充。接下来,我拔出与众不同的用户:
var users = dt.Rows.Cast<DataRow>()
.Select(x => x.Field<string>("User"))
.Distinct()
.OrderBy(x => x)
.ToList();
您很有可能会扭转这种情况,并从用户列表开始。
现在,我为每个用户创建一个Series
,并为其过滤后的BindingSource
:
for (int i = 0; i < users.Count; i++)
{
Series s = chart1.Series.Add(users[i]);
s.ChartType = SeriesChartType.Line;
BindingSource bs = new BindingSource();
bs.DataSource = dt;
bs.Filter = "User='" + users[i] + "'";
s.Points.DataBindXY(bs, "Date", bs, "Value");
}
现在我绑定我的DGV:
BindingSource bsdgv = new BindingSource();
bsdgv.DataSource = dt;
bsdgv.Filter = "";
dataGridView1.DataSource = bsdgv;
我通过将Series
设置为Transparent
隐藏了它们。这样,名称仍显示在图例中。技巧是将原始颜色保留在系列的Tags
..:
void hideAllSeries(Chart chart)
{
chart.ApplyPaletteColors();
foreach (Series s in chart.Series)
{
if (s.Color != Color.Transparent) s.Tag = s.Color;
s.Color = Color.Transparent;
}
}
要显示或隐藏Series
,我要对MouseClick
事件进行编码:
private void Chart1_MouseClick(object sender, MouseEventArgs e)
{
var hitt = chart1.HitTest(e.X, e.Y);
if (hitt.ChartElementType == ChartElementType.LegendItem)
{
Series s = hitt.Series;
if (s.Color == Color.Transparent)
{
s.Color = (Color)s.Tag;
}
else
{
s.Tag = s.Color;
s.Color = Color.Transparent;
}
}
}
让我们看看它在工作:
代替此解决方案,您可能需要添加用户选择清单并设置DGV的BindingSource的筛选器。