2012-08-22 62 views
0

我正在使用數據網格視圖來顯示1000行和800列的數據(每個單元只有一個字符)。還有一個複選框列。我添加了一個上下文菜單項,如「查看選定的單元格」。點擊那個我試圖只顯示檢查行。對於那個較早的我,通過循環遍歷每一個,將Visible未經檢查的行的屬性設置爲False。這花費了很多時間。DataView RowFilter沒有給出正確的結果

所以我嘗試使用DataView控制應用RowFilter。它看起來更快一些,但是。但是一些檢查行不可見。

例如如果我有10行,其中5行被檢查。然後只有4行可見。其實它應該顯示5行被檢查。

我想這些東西

  1. dView.RowFilter="CheckBoxCol";
  2. dView.RowFilter="CheckBoxCol=true";

與這兩個東西我得到同樣的問題。誰可以幫我這個事?

+1

是否有您的dataviewcontrol的基礎綁定數據源(如數據表,對象列表),或者是你手動填充數據網格? –

+0

你顯示的兩個選項都應該很好 - 我提供了一個基於我可以認爲會發生這種情況的唯一原因的答案。如果我的猜測錯誤,請提供有關如何重現此問題的詳細信息。最小解決方案的代碼將是最好的。 –

回答

0

您顯示的兩種方法都會在布爾列上以RowFilter的形式工作。

這很有可能是您用DataGridView處理編輯的方式遇到問題 - 直到當前編輯單元失去焦點並且以最常見的方式顯示上下文菜單後,它們纔會被提交到基礎數據源在網格上,細胞不會失去焦點。

也就是說,如果你表現出你的上下文菜單中做這樣的事情:

void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Right) 
    {    
     contextMenuStrip1.Show(dataGridView1, e.Location); 
    } 
} 

然後你改變了最近的複選框會不會刷新其數據視圖的變化。

解決方案分爲兩部分。首先,您需要引入位於數據視圖和數據網格之間的綁定源。

bindingSource1.DataSource = dView; 
dataGridView1.DataSource = bindingSource1; 

然後,你需要將以下代碼添加到「CurrentCellDirtyStateChanged」處理程序上的數據網格視圖:

void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e) 
{ 
    if (dataGridView1.IsCurrentCellDirty) 
    { 
     dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit); 
    } 
} 

最後,您應用過濾器的代碼中,你還需要調用EndEdit在綁定源:

private void filterToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    bs.EndEdit(); 
    dvSections.RowFilter = "CheckBoxCol"; 
} 

在我以前的經驗次e綁定源是沒有必要的,但我還沒有嘗試過這種混合的上下文菜單和數據視圖,當我嘗試時發現需要bs.EndEdit()

0

我認爲大衛音樂廳是正確的(對不起,我沒有足夠的積分只評論 - 這正是我打算在這裏做的)。如果數據網格視圖的底層源表

嘗試Table.AcceptChanges可能。

這應該犯任何揮之不去更改表,然後到DGV