使用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);
请问好吗?
答案 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;