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

graph line (X,Y,Z) control

你好,我正在寻找一个可以让我制作 Z 线图控件的图表,现在我有 X (Payment_Date) 和 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();

第一步:为每个要绑定的元素创建一个单独的 BindingSource 并设置一个合适的 Filter,这样每个元素只会显示一个用户的数据。

第二步:显示和隐藏您想要的系列。

我创建了一个包含 3 列的 DataTable dt

dt.Columns.Add("User", typeof(string));
dt.Columns.Add("Date", typeof(DateTime));
dt.Columns.Add("Value", typeof(double));

并随机填充。接下来我拉出 distinct users:

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..:[=​​27=] 中保留原始颜色

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 过滤器而不是此解决方案..