Я пытаюсь написать метод, который принимает ComboBox, DataTable и TextBox в качестве аргументов. Цель этого - отфильтровать элементы, отображаемые в ComboBox, в соответствии с TextBox.Text. DataTable содержит полный список возможных записей, которые затем будут отфильтрованы. Для фильтрации я создаю DataView для DataTable, добавляю RowFilter и затем связываю это представление с ComboBox как DataSource.
Чтобы пользователь не мог вводить в ComboBox, я выбираю DropDownStyle DropDownList. Пока это работает нормально, за исключением того, что пользователь также должен иметь возможность выбирать ничего / пустую строку. Фактически, это должен быть элемент по умолчанию, который будет отображаться (чтобы избежать случайного выбора неправильного элемента, если пользователь слишком быстро щелкает по диалоговому окну).
Я попытался решить эту проблему, добавив новую строку в представление. Хотя в некоторых случаях это работает, основная проблема заключается в том, что любой метод DataTable может быть передан методу. Если DataTable содержит столбцы, которые не могут быть нулевыми и не содержат значения по умолчанию, я полагаю, что возникнет ошибка, добавив пустую строку.
Можно создать представление, содержащее только столбец, определенный как DisplayMember, и столбец, определенный как ValueMember. Увы, этого нельзя сделать с помощью представления в C #. Я хотел бы избежать создания истинной копии DataTable любой ценой, так как кто знает, насколько большой он станет со временем.
У вас есть предложения, как обойти эту проблему?
Вместо представления, могу ли я создать объект, содержащий два элемента, и назначить DisplayMember и ValueMember этим элементам? Будут ли участники переданы в качестве ссылки (что я надеюсь) или будет создано истинное копирование (в этом случае это не будет решением)?
Большое спасибо за помощь!
С наилучшими пожеланиями
public static void ComboFilter(ComboBox cb, DataTable dtSource, TextBox filterTextBox)
{
cb.DropDownStyle = ComboBoxStyle.DropDownList;
string displayMember = cb.DisplayMember;
DataView filterView = new DataView(dtSource);
filterView.AddNew();
filterView.RowFilter = displayMember + " LIKE '%" + filterTextBox.Text + "%'";
cb.DataSource = filterView;
}