如何将datagridview定位到搜索的文本输入

时间:2012-07-27 16:21:14

标签: winforms c#-4.0 linq-to-sql datagridview find

使用Windows窗体和linq到Sql,我将datagridview绑定到Products Table,我添加到表单1 Textbox中输入搜索到的文本。 我想知道如何根据输入的文本定位datagridview以查找给定的ProductName。 这里我不想过滤行,我只想在输入每个字符后重新定位datagrid,使用的代码:

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

代码的执行会产生下一个错误:在ligne处未处理System.NotSupportedException:

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

请问好吗?

1 个答案:

答案 0 :(得分:2)

MSDN documentation for 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;