У меня есть DataGridView, который привязан к BindingList.
private void InitGrid()
{
Ctx.MyEntitySet.Load();
dataGridView1.DataSource = Ctx.MyEntitySet.Local.ToBindingList();
dataGridView1.Columns["Id"].Visible = false;
dataGridView1.Columns["UnwantedCol1"].Visible = false;
dataGridView1.Columns["UnwantedCol2"].Visible = false;
dataGridView1.Columns["UnwantedCol3"].Visible = false;
}
и фильтрующий TextBox с обработкой события TextChanged следующим образом
private void textBoxFilter_TextChanged(object sender, EventArgs e)
{
try
{
string filter = textBoxFilter.Text.Trim();
((DataView)dataGridView1.DataSource).RowFilter = filter;
textBoxFilter.BackColor = SystemColors.AppWorkspace;
}
catch (Exception)
{
textBoxFilter.BackColor = Color.Red;
ToolTip tip = new ToolTip();
tip.SetToolTip(textBoxFilter, ex.Message);
}
}
Я запускаю код, данные отображаются правильно, но когда я пытаюсь ввести что-то вроде ColumnName like '%sometext%'
в текстовое поле моего фильтра, я получаю исключение, говорящее, что я не могу привести «System.Data.Entity.Internal.ObservableBackedBindingList`1[MyEntity ]» на «System.Data.DataView».
Может ли кто-нибудь дать мне указатель?
Спасибо, Ф.
РЕШЕНО:
Добавлен общий метод расширения
public static class LocalExtensions
{
public static IEnumerable<T> Filter<T>(this IEnumerable<T> list, Func<T, bool> filterParam)
{
return list.Where(filterParam);
}
}
И измененный обработчик события TextChanged следующим образом:
private void textBoxFilter_TextChanged(object sender, EventArgs e)
{
try
{
string filter = textBoxFilter.Text.Trim();
dataGridView1.DataSource =
Ctx.MyEntitySet.Local
.Filter(x =>
x.EntityPropertyToSearchIn1.ToUpper().Contains(filter.ToUpper()) ||
x.EntityPropertyToSearchIn2.ToUpper().Contains(filter.ToUpper())
).ToList();
textBoxFilter.BackColor = SystemColors.AppWorkspace;
}
catch (Exception)
{
textBoxFilter.BackColor = Color.Red;
ToolTip tip = new ToolTip();
tip.SetToolTip(textBoxFilter, ex.Message);
}
}