更改相同系列C#的颜色列

问题描述 投票:1回答:1

我有一个chart1对象,并向其中添加了一个列,其中包含n列。我希望根据某些条件将列涂成红色或绿色。

我有以下用于if的代码,但是即使我经历过if,所有这些代码都被涂成绿色。

我已经使用过断点,并且如果它通过了if and else,但它没有按我的意愿绘制列。

//maximum line
StripLine linea = new StripLine();
linea.StripWidth = 0;
linea.BorderColor = System.Drawing.Color.Red;
linea.BorderWidth = 2;
linea.BorderDashStyle = ChartDashStyle.Solid;
linea.IntervalOffset = 75;
linea.BackColor = System.Drawing.Color.Orange;

chart1.ChartAreas[0].AxisY.StripLines.Add(linea);

//minimum line
StripLine lineaM = new StripLine();
lineaM.StripWidth = 0;
lineaM.BorderColor = System.Drawing.Color.Green;
lineaM.BorderWidth = 2;
lineaM.BorderDashStyle = ChartDashStyle.Solid;
lineaM.IntervalOffset = 45;
lineaM.BackColor = System.Drawing.Color.Orange;
chart1.ChartAreas[0].AxisY.StripLines.Add(lineaM);

chart1.Series.Clear();
chart1.Series.Add("Series1");
chart1.Series["Series1"].BorderWidth = 3;
chart1.Titles.Clear();
chart1.Titles.Add("Total changes");
chart1.ChartAreas[0].AxisY.Maximum = 100;

for (int i = 0; i < dt.Rows.Count;i++)
{
    string qty = dt.Rows[i]["PID"].ToString();
    if (Convert.ToInt32(qty) > 45)//if it is greater than the minimum, the column must be red
    {
        chart1.Series["Series1"].XValueMember = "MES";
        chart1.Series["Series1"].YValueMembers = "PID";
        chart1.Series["Series1"].Color = Color.Red;
    }
    else //otherwise it must be green
    {
        chart1.Series["Series1"].XValueMember = "MES";
        chart1.Series["Series1"].YValueMembers = "PID";
        chart1.Series["Series1"].Color = Color.Green;
    }
}

chart1.Series["Series1"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Column;

//chart1.ChartAreas["ChartData"]
chart1.DataSource = dt;
chart1.DataBind();  

例如,March应该是红色的,因为它超过了最小行:chart

有人可以帮我吗?

c# visual-studio winforms visual-studio-2012 charts
1个回答
0
投票

我不知道您正在使用的图表组件,但是显然,可以在绑定数据点之后通过调用事件处理程序来自定义点。看来您必须执行以下操作:

private void CustomizeBarColours(object sender, System.EventArgs e)
{
    for (int i = 0; i < dt.Rows.Count;i++)
    {
        string qty = dt.Rows[i]["PID"].ToString();
        if (Convert.ToInt32(qty) > 45)//if it is greater than the minimum, the column must be red
        {
            chart1.Series["Series1"].Points[i].Color = Color.Red;
        }
        else //otherwise it must be green
        {
            chart1.Series["Series1"].Points[i].Color = Color.Green;
        }
    }
}

当心索引超出范围,用i索引到RowsPoints的方式不是很优雅。

然后在您的DataBind之后可以添加:

chart1.Customize += CustomizeBarColours;

来自for循环的这两行,您只需要执行一次:

chart1.Series["Series1"].XValueMember = "MES";
chart1.Series["Series1"].YValueMembers = "PID";

然后您可以完全删除for循环。

© www.soinside.com 2019 - 2024. All rights reserved.