图形线 (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 过滤器而不是此解决方案..
你好,我正在寻找一个可以让我制作 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 过滤器而不是此解决方案..