2013-12-11 3 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

Hi Yuriy - спасибо за помощь. Я пробовал приведенный выше код, и каждый раз, когда я ввожу число, превышающее 1, это приводит к сбою моего приложения с сообщением об ошибке: 'Необработанное исключение типа 'System.InvalidOperationException' произошло в System.Windows.Forms.dll. Дополнительная информация: Строка, связанная с позицией валютного менеджера, не может быть сделана невидимой. ' – 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 иначе.

ПРИМЕЧАНИЯ: Строки должны быть незаметно, чтобы начать, или вы можете сделать их видимыми для запуска и просто изменить, если заявление != driverNo.Text и установите false

+0

Предположим, что строки видны для запуска - будет ли код выглядеть так? http://pastebin.com/e0attSHs – theshizy

Смежные вопросы