2015-12-27 49 views
1

我有3個datagridviews,並且它們每個都有單獨的綁定源。但是,所有三個綁定源都從相同的數據表中獲取數據。DataGridView顯示設置爲不可見的列

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

I控制用戶看到具有以下邏輯什麼:顯示在第一柵極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:RowPostPaintCellPainting。我評論了我在這些事件中所做的一切,並仍然遇到這個問題。我也有一些其他的,如DataError,CellValueChanged(內部爲空),Scroll等,但我認爲它們是無關緊要的。

所以我想知道是否有另一個事件,我沒有註冊,這可能是由自己做到這一點。

回答

1

由於綁定數據源時發生的默認行爲,您會看到此行爲。要修復,請處理每個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; 
} 
+0

謝謝,這是一個很好的解決方案。 – Iason

相關問題