2016-07-19 3 views
4

У меня есть два DataGridViews в Winforms. DataGrid1 подключен к таблице, содержащей список заданий, которые необходимо выполнить. Когда кто-то завершает работу, он вводится в отдельную таблицу как завершенную, которая связана с DataGrid2.Фильтровать источник привязки на основе строк другого DataGridView

Мне нужно отфильтровать источник привязки для DataGrid1, чтобы при выполнении задания в DataGrid2 он был отфильтрован из DataGrid1. Текущий код, который я использую, только фильтрует источник привязки по последней записи в DataGrid2, и мне нужно его фильтровать всеми элементами.

Как фильтровать BindingSourc e для DataGrid1 на основе всех значений столбца DataGrid2?

foreach (DataGridViewRow row in dataGrid2.Rows) 
{ 
    DataGrid1BindingSource.Filter = 
     string.Format("ColumnName <> '{0}'", row.Cells[1].Value); 
} 

Вот пример всех рабочих мест в таблице данных, то первой сетки, которая содержит неполные рабочие места и вторую сетку, которая содержит выполненные задания. Задания, которые должны быть показаны в неполном сетке, являются теми задачами, которые не в завершенных заданиях сетки:

__________  ____________  ___________ 
| All Jobs |  | Incomplete |  | Completed | 
|――――――――――|  |――――――――――――|  |―――――――――――| 
| JobTitle |  | JobTitle |  | JobTitle | 
|――――――――――|  |――――――――――――|  |―――――――――――| 
| Job 1 |  | Job 1  |  | Job 3  | 
| Job 2 |  | Job 2  |  | Job 4  | 
| Job 3 |  |   |  |   | 
| Job 4 |  |   |  |   | 
‾‾‾‾‾‾‾‾‾‾  ‾‾‾‾‾‾‾‾‾‾‾‾  ‾‾‾‾‾‾‾‾‾‾‾ 
+0

Какие технологии? WinForms? WebForms? WPF? Silverlight? ASP.NET MVC? –

+0

Я использую Winforms. –

+0

@ChrisSonger неясно, о чем вы спрашиваете. Перепишите вопрос и опишите немного больше об этом, также покажите пример grid1 и grid2 в начальном состоянии и скажите, что будет результатом фильтра. –

ответ

3

Перед чтением ответа, вы должны знать, если вы не имеете bool поля или что-то определить, какие работа завершена, это не очень хороший дизайн. У вас должен быть один список заданий. Затем, основываясь на поле bool, вы должны показывать неполные задания в первой сетке и завершенные задания во второй сетке. Тогда фильтр будет просто Completed = true и Completed = false.

В любом случае, вы можете использовать IN в выражении фильтра. Этого достаточно, чтобы создать список значений, которые вы хотите использовать в фильтре, а затем создать фильтр таким образом:

var ids = this.dataGridView2.Rows.Cast<DataGridViewRow>() 
       .Where(r => !r.IsNewRow) 
       .Select(r => r.Cells[0].Value.ToString()); 
bs1.Filter = string.Format("Column1 NOT IN ({0})", string.Join(",", ids)); 

В приведенном выше примере я якобы идентификаторы int так, например "Column1 NOT IN (1,2,3)" будет фильтр. Для идентификаторов строк фильтр будет "Column1 NOT IN ('a','b','c')". Таким образом, вы можете изменить оператор выбора, как показано ниже:

.Select(r => string.Format("'{0}'",r.Cells[0].Value.ToString())); 
+1

Я на самом деле пытаюсь сравнить две таблицы друг с другом, поэтому Grid1 имеет список заданий, а Grid2 имеет список заданий, каждый из которых имеет свой собственный источник привязки. Я пытаюсь сделать так, что когда задание будет введено в заполненные задания Grid2, оно будет отфильтровано из списка заданий в Grid1 –

+0

. Обратите внимание, что список значений создается из сетки 2, а затем фильтр, назначенный сетке 1. Это путь, который находится в сетке 2, не будет отображаться в сетке 1, в сетке будут отображаться только другие строки. –

+0

Теперь я получаю Синтаксическую ошибку: Отсутствует операнд после оператора JobTitle. В названии задания есть пробел. Я использовал дизайн с заполненным полем true/false для других приложений. Причина, по которой я не использую его здесь, состоит в том, что список вакансий, которые необходимо выполнить, не изменяется. Как только количество строк списка, содержащего задания, станет равным нулю, фильтр будет удален, и пользователь снова запустится с полным списком. –

0

Этот фрагмент довольно некрасиво, но это должно дать вам намек на то, что делать:

var colname = YOURGRIDTOFILTER.Columns[INDEXOFCOLUMNTOFILTER].HeaderText; 
      var filterString = colname+" <> "; 
      foreach (DataGridViewRow row in dataGrid2.Rows) 
      { 
       filterString += "'" + row.Cells[1].Value + "' OR "+colname+" <> "; 
      } 
      filterString = filterString.Substring(0, filterString.LastIndexOf("OR"));