BindingList にデータバインドされた DataGridView があります
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;
}
TextChanged イベントが次のように処理されるフィルタリング TextBox
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);
}
}