2013-12-11 80 views
0

我想隱藏在數據網格的所有行不以driverNo.Text匹配文本,但是當driverNo.Text是空的,我想所有的datagrid中的行出現。我怎麼做到這一點?隱藏所有行不匹配driverNo.Text

private void driverNo_KeyUp(object sender, KeyEventArgs e) 
    { 
     foreach (DataGridViewRow row in dataGridView1.Rows) 
     { 
      if (row.Cells[1].Value.ToString() == driverNo.Text) 
      { 

      } 
      else if (row.Cells[1].Value.ToString() == null) 
      { 

      } 
     } 
    } 
+0

一個更好的辦法可能是過濾數據源。這是一個綁定的網格嗎?如果綁定到DataView,則可以使用其過濾器屬性。在上面你可以設置行高爲0,但它不會完全消失。例如row.Height = 0 – rheitzman

回答

1

這應該解決的問題:

CurrencyManager manager = (CurrencyManager)BindingContext[dataGridView1.DataSource]; 
manager.SuspendBinding(); 
bool shouldNotFilter = string.IsNullOrEmpty(driverNo.Text); 
foreach (DataGridViewRow row in dataGridView1.Rows) 
{ 
    if (shouldNotFilter) 
    { 
     row.Visible = true; 
    } 
    else 
    { 
     if (!string.Equals(row.Cells[1].Value.ToString(), driverNo.Text, StringComparison.OrdinalIgnoreCase)) 
     { 
      row.Visible = false; 
     } 
     else 
     { 
      row.Visible = true; 
     } 
    } 
} 
manager.ResumeBinding(); 

這種做法是直線前進,但速度慢,我建議你看一看DataView及其RowFilter財產。 Here就是一個很好的例子。

+0

嗨尤里 - 感謝您的幫助。我已經嘗試了上面的代碼,並且每次輸入大於1的任何數字時,它都會崩潰我的應用程序並顯示以下錯誤消息:System.Windows.Forms.dll中發生類型爲「System.InvalidOperationException」的未處理的異常。附加信息:與貨幣經理的倉位相關聯的行不能被隱藏起來。# – theshizy

+0

@ Antoine-LaurentLavoisier,我懷疑你正在以下面的方式使用'CurrencyManager' CurrencyManager manager =(CurrencyManager)BindingContext [datagridview1.DataSource]; '你可以分別在提供的代碼'manager.SuspendBinding();','manager.ResumeBinding();'之前和之後添加以下行。這應該可以解決問題,但這不是一個好的解決方案,我建議看看DataView。希望這可以幫助。 – Yuriy

+0

您可以請更新答案以反映它 - 這是我的代碼現在的樣子 - http://pastebin.com/xNGgsdKi – theshizy

0

這可能不完全是你所需要的,但沿着這些線?

private void driverNo_KeyUp(object sender, KeyEventArgs e) 
{ 
    // Set all rows.Visible = false in design 
    if (driverNo.Text = "") 
    { 
     foreach (DataGridViewRow row in dataGridView1.Rows) 
     { 
      row.Visible = true; 
     } 
    } 
    else 
    { 
     foreach (DataGridViewRow row in dataGridView1.Rows) 
     { 
      if (row.Cells[1].Value.ToString() == driverNo.Text) 
      { 
       row.Visible = true; 
      } 
     } 
    } 
} 

這將使所有行可見,如果driverNo.Text是空,只能說明什麼是包含在driverNo.Text否則行。

注:該行需要是不可見的開始,或者你可以讓他們看到開始,只是改變if語句!= driverNo.Text並設置爲false

+0

假設行是可見的開始 - 代碼會是這樣嗎? http://pastebin.com/e0attSHs – theshizy