1

Windows フォームと linq to Sql を使用して、datagridview を Products テーブルにバインドし、検索したテキストを入力するためにフォーム 1 Textbox に追加しました。特定の ProductName を検索するために入力されたテキストに従って datagridview を配置する方法を知りたいです。ここでは、行をフィルタリングしたくありません。入力された各文字、使用されたコードの後に​​データグリッドを再配置したいだけです:

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        var searchValue = textBox1.Text.Trim().ToUpper();
        var qry = (from p in dc.Products
                   where p.ProductName.ToUpper().StartsWith(searchValue)
                   select p).ToList();
        int itemFound = productBindingSource.Find("ProductName", searchValue);
        productBindingSource.Position = itemFound;
    }

コードを実行すると、次のエラーが発生します: System.NotSupportedException was unhandled at the line:

int itemFound = productBindingSource.Find("ProductName", searchValue);

任意のアイデアをお願いします?

4

1 に答える 1

2

MSDNドキュメントにBindingSourceは答えがあります:

Find メソッドは、基になるリストが検索が実装された IBindingList である場合にのみ使用できます。このメソッドは、基になるリストの IBindingList.Find メソッドへの要求を参照するだけです。たとえば、基になるデータ ソースが DataSet、DataTable、または DataView の場合、このメソッドは propertyName を PropertyDescriptor に変換し、IBindingList.Find メソッドを呼び出します。一致するアイテムが見つからない場合に返される値など、Find の動作は、基になるリストのメソッドの実装によって異なります。

基になるデータ ソースが IBindingList を実装していない BindingSource でこのメソッドを呼び出すと、例外が表示されます ( IBindingList.FindCoreの既定の実装によってスローされます。

System.NotSupportedException: 指定されたメソッドはサポートされていません。

バインディング ソースを何にバインドするかは示していませんが、明らかにこのメソッドを実装していません。

厄介なことに、データ ソースに使用する推奨リスト タイプにはBindingList<T>実装FindCoreありません。

BindingList を使用している場合は、独自のカスタム タイプを作成する必要があります。これは、find をサポートする BindingList の完全に必要最小限の実装のコードです。

public class FindableBindingList<T> : BindingList<T>
{

    public FindableBindingList()
        : base()
    {
    }

    public FindableBindingList(List<T> list)
        : base(list)
    {
    }

    protected override int FindCore(PropertyDescriptor property, object key)
    {
        for (int i = 0; i < Count; i++)
        {
            T item = this[i];
            if (property.GetValue(item).Equals(key))
            {
                return i;
            }
        }
        return -1; // Not found

    }
}

並べ替えのサポートなど、BindingList の独自の実装で多くのことができます。私の答えは、find メソッドをサポートするための最低限のものとして残しました。詳細については、SortableBindingList を検索してください。


このクラスを使用するには、次のようにします。

var qry = (from p in dc.Products
               where p.ProductName.ToUpper().StartsWith(searchValue)
               select p).ToList();    

FindableBindingList<YourType> list = new FindableBindingList<YourType>(qry);

dataGridView1.DataSource = list;
于 2012-07-28T13:52:35.520 に答える