1

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);
    }
}
4

3 に答える 3

1

基本的に、 BindingListを DataGridView に直接配置することはできません。BindingSourceを定義し、BindingList をこの BindingSource に割り当てる必要があります。これが機能するかどうかを確認するためにこれを試してください:

Ctx.MyEntitySet.Load();
BindingSource yourBS = new BindingSource();
yourBS.DataSource = Ctx.MyEntitySet.Local.ToBindingList();

dataGridView1.DataSource = yourBS;
dataGridView1.Columns["Id"].Visible = false;
dataGridView1.Columns["UnwantedCol1"].Visible = false;
dataGridView1.Columns["UnwantedCol2"].Visible = false;
dataGridView1.Columns["UnwantedCol3"].Visible = false;

うまくいくことを願っています。:)

よろしく。

于 2012-10-31T10:49:19.793 に答える
1

フィルタリングされた新しい BindingList を作成する必要があります。LINQで簡単にできます。バインディング リストのフィルタリングを参照してください。

try
{
    string filter = textBoxFilter.Text.Trim();
    dataGridView1.DataSource = new BindingList<YOUR_ENTITY>(Ctx.MyEntitySet.Local.ToBindingList().Where(x => x.EntityPropertyToSearchIn1.ToUpper().Contains(filter)).ToList<YOUR_ENTITY>());
    textBoxFilter.BackColor = SystemColors.AppWorkspace;
}
于 2014-04-08T22:25:42.987 に答える