图形线(X,Y,Z)控制

时间:2019-04-08 07:01:09

标签: c# winforms graph line

你好,我正在搜索一个图形,该图形将允许我制作Z线图控件。现在我有了X(付款日期)和Y(收集)线,如何制作Z(用户名)线 我希望每个用户名都单独一行

有人可以帮我吗?

我想在普通的C#win窗体应用程序上制作程序

我的表格 My Form

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();

enter image description here

1 个答案:

答案 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;
        }
    }
}

让我们看看它在工作:

enter image description here

代替此解决方案,您可能需要添加用户选择清单并设置DGV的BindingSource的筛选器。