我有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等,但我认为它们无关紧要。
所以我想知道是否还有其他事件我没有注册,这可能是单独做的。
答案 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;
}