DataGridView显示设置为不可见的列

本文关键字:显示 设置 DataGridView | 更新日期: 2023-09-27 18:28:19

我有3个数据网格视图,每个视图都有一个单独的绑定源。然而,所有三个绑定源都从同一个数据表中获取数据。

        bindingSource1.DataSource = mytable;
        bindingSource2.DataSource = mytable;
        bindingSource3.DataSource = mytable;
        dataGridView1.DataSource = bindingSource1;
        dataGridView2.DataSource = bindingSource2;
        dataGridView3.DataSource = bindingSource3;

我用以下逻辑控制用户看到的内容:在第一个网格上显示10个第一列,在第二个网格上展示下一个10,在第三个网格上展现下一个十。

for (int i = 0; i < mytable.Columns.Count; i++)
        {
            dataGridView1.Columns[i].Visible = i < 10;
            dataGridView2.Columns[i].Visible = (i >= 10 && i < 20);
            dataGridView3.Columns[i].Visible = (i >= 20 && i < 30);
        }

当我在数据表中有许多列时,这种方法可以很好地工作。

问题如果我的数据表中的列少于10列,通常它们应该只显示在第一个数据网格视图中。这种情况确实发生了,但数据表的第一列总是显示在数据网格2和3中。我已经遍历了我的循环,看看某个条件是否错误,我发现它是正确的。因此,我非常确信这一定是随之而来的事件之一。我为我的网格注册了两个事件,它们可能是cuplrits:RowPostPaintCellPainting。我评论了我在这些活动中所做的一切,但仍然遇到了这个问题。我还有其他一些,比如DataError、CellValueChanged(内部为空)、Scroll等,但我认为它们无关紧要。

所以我想知道是否还有另一个我没有注册的活动,它可能是自己做的。

DataGridView显示设置为不可见的列

您之所以看到这种行为,是因为绑定数据源时发生了默认行为。要修复此问题,请处理每个DataGridView.DataBindingComplete事件。我们将对每个事件使用相同的事件处理程序:

dataGridView1.DataBindingComplete += DataGridView_DataBindingComplete;
dataGridView2.DataBindingComplete += DataGridView_DataBindingComplete;
dataGridView3.DataBindingComplete += DataGridView_DataBindingComplete;

在该事件处理程序中,我们将像以前一样设置可见列。但我们也将设置行标题的可见性以及滚动条,以防没有列可见。

private void DataGridView_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
    DataGridView view = sender as DataGridView;
    bool anyVisible = false;
    int max = 0, min = 0;
    if (view == this.dataGridView1)
    {
        min = 0;
        max = 10;
    }
    else if (view == this.dataGridView2)
    {
        min = 10;
        max = 20;
    }
    else if (view == this.dataGridView3)
    {
        min = 20;
        max = 30;
    }
    for (int i = 0; i < this.table.Columns.Count; i++)
    {
        view.Columns[i].Visible = i >= min && i < max;
        anyVisible = anyVisible || view.Columns[i].Visible;
    }
    view.RowHeadersVisible = anyVisible;
    view.ScrollBars = anyVisible ? ScrollBars.Both : ScrollBars.None;
}