изменить цвет столбца той же серии C# - PullRequest
1 голос
/ 02 апреля 2020

У меня есть объект chart1, и я добавляю к нему серию с n столбцами. Я хочу, чтобы столбцы были окрашены в красный или зеленый цвет по определенным критериям.

У меня есть следующий код для if, но, например, все они окрашены в зеленый цвет, хотя я прошел через if.

Я уже использовал точки останова, и если он проходит через if и 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();  

Например, март должен быть красным, потому что он превышает минимальная строка:
chart

Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 02 апреля 2020

Я не знаю, какой компонент диаграммы вы используете, но, очевидно, точки можно настроить после привязки к данным, вызвав обработчик событий. Похоже, вы должны сделать что-то вроде этого:

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 используется для индексации как Rows, так и Points .

Затем после DataBind вы можете добавить:

chart1.Customize += CustomizeBarColours;

Эти две строки из для l oop вам нужно сделать только один раз:

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

А потом вы можете убрать свой для l oop в целом.

...