DataGridView背景颜色更改仅适用于第一个选项卡

时间:2016-05-16 10:17:18

标签: c# winforms datagridview tabs

我有一个带有三个标签的标签控件。每个选项卡都包含一个DataGridView,它显示的格式相同,但来自不同的来源。要求是网格中的每一行都有不同的背景颜色(与选项卡中显示的数据图表相匹配)。

为了避免重复同一个代码块三次,我有一个方法可以将数据加载到网格中,并且还可以根据数据构建图表。它的形式为:

private void loadData(DataGridView theGrid, Chart theChart, int dataSource)

使用以下语句调用此方法:

loadData(onShoreView, onShoreChart, 1);
loadData(offShoreView, offShoreChart, 2);
loadData(globalView, globalChart, 3);

loadData()然后从数据库中检索相关数据,并使用以下内容构建分配给网格的List:

theGrid.DataSource = dataList;

在网格填充后执行为行着色的方法部分:

        //Assign colors to rows - but not the total line
        for (int i = 0; i < theGrid.Rows.Count - 1; i++)
        {
            theGrid.Rows[i].DefaultCellStyle.BackColor = theColors[i];
            theGrid.Rows[i].Cells[4].Style.BackColor = Color.White;
        }

theColors以前被定义为:

private Color[] theColors= {
                                Color.SteelBlue,
                                Color.IndianRed,
                                Color.LightGreen,
                                Color.Orange,
                                Color.PaleTurquoise,
                                Color.Gold,
                                Color.RosyBrown,
                                Color.MediumPurple,
                                Color.MidnightBlue,
                                Color.Pink
                            };

这适用于第一个选项卡 - 网格线具有正确的颜色,并且图表与它们匹配。对于后续选项卡,虽然图表上的颜色是正确的,但网格不受影响 - 行都是相同的默认颜色。

我有双重和三重检查,除了名称之外,第二个和第三个选项卡上的DataGridView对象的所有属性都与第一个选项卡上的DataGridView的属性相同。

任何人都可以提出可能发生的事情,以及如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

我建议你处理SelectedIndexChanged的事件TabControl,以便致电您的方法&#34; loadData&#34;只要用户选择了标签,就像您可以安静地认为您的程序不是一种不必要的处理方式,它对性能有益:

  private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
        {
            var grd = tabControl1.SelectedTab.Controls.Cast<Control>()
                                       .FirstOrDefault(x => x is DataGridView );

       var chrt = tabControl1.SelectedTab.Controls.Cast<Control>()
                                       .FirstOrDefault(x => x is Chart);
       //tabControl1.SelectedIndex=0 if first tab is selected
       //tabControl1.SelectedIndex=1 if second tab is selected
        int i = tabControl1.SelectedIndex+1;
        loadData((DataGridView)grd, (Chart)chrt, i);

    }