DataGridView显示设置为不可见

时间:2015-12-27 11:20:21

标签: c# .net winforms datagridview datatable

我有3个datagridviews,每个都有一个单独的绑定源。但是,所有三个绑定源都从同一数据表中获取数据。

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

我使用以下逻辑控制用户看到的内容:在第一个网格上显示10个第一列,在第二个网格上显示下一个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列,通常它们只应显示在第一个datagridview中。这确实发生了,而且数据表的第一个列总是显示在数据网格2和3中。我已经逐步完成循环以查看条件是否错误,并且我发现它是正确的。因此,我很确定它一定是其后的事件之一。我为我的网格注册了两个可能是cuplrits的事件: RowPostPaint CellPainting 。我评论了我在这些事件中所做的一切,但仍然遇到了这个问题。我还有其他一些,比如DataError,CellValueChanged(内部空白),Scroll等,但我认为它们无关紧要。

所以我想知道是否还有其他事件我没有注册,这可能是单独做的。

1 个答案:

答案 0 :(得分:1)

由于绑定数据源时发生的默认行为,您会看到此行为。要修复,请处理每个DataGridView.DataBindingComplete事件。我们将为每个使用相同的事件处理程序:

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

在该事件处理程序中,我们将像以前一样设置可见列。但我们也会设置行标题&#39;可见性以及滚动条 - 如果没有列可见。

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;
}