5

我有BindingSource一个BindingList<Foo>附件作为数据源。我想使用BindingSource'sFind方法来查找元素。但是,NotSupportedException当我执行以下操作时会抛出 a ,即使我的数据源确实实现了IBindingList(并且 MSDN 中没有记录此类异常):

int pos = bindingSource1.Find("Bar", 5);

我在下面附上了一个简短的例子(a ListBox、aButton和 a BindingSource)。任何人都可以帮助我使Find调用正常工作吗?

public partial class Form1 : Form
{
    public Form1() { InitializeComponent(); }

    private void Form1_Load(object sender, EventArgs e)
    {
        var src = new BindingList<Foo>();
        for(int i = 0; i < 10; i++)
        {
            src.Add(new Foo(i));
        }

        bindingSource1.DataSource = src;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        int pos = bindingSource1.Find("Bar", 5);
    }
}

public sealed class Foo
{
    public Foo(int bar)
    {
        this.Bar = bar;
    }

    public int Bar { get; private set; }

    public override string ToString()
    {
        return this.Bar.ToString();
    }
}
4

3 回答 3

20

我能够使用解决我的类似问题

var obj = bindingSource1.List.OfType<Foo>().ToList().Find(f=> f.Bar == 5);
var pos = bindingSource1.IndexOf(obj);
bindingSource1.Position = pos;

这有利于看到位置以及找到对象

于 2013-01-04T06:10:43.843 回答
-1

BindingList<T>不支持搜索,原样。实际上bindingSource1.SupportsSearching返回false。该Find功能适用​​于其他想要实现IBindingList支持搜索的接口的类。

要获得价值,您应该这样做bindingSource1.ToList().Find("Bar",5);

于 2012-06-13T14:18:25.270 回答
-1

接受的答案暗示了这个问题的答案。未在 IBindingList 上实现查找。您需要在自己的类中继承 IBindingList 并实现 find。您还需要表明使用和覆盖 SupportsSearchingCore 支持查找。这是对问题的实际答案,例如如何让 Find 在 BindingList 上工作。

public class EfBindingList<T> : BindingList<T>
    where T : class
{
    public EfBindingList(IList<T> lst) : base(lst)
    {
    }

    protected override bool SupportsSearchingCore
    {
        get { return true; }
    }

    protected override int FindCore(PropertyDescriptor prop, object key)
    {
        var foundItem = Items.FirstOrDefault(x => prop.GetValue(x) == key);
        // Ignore the prop value and search by family name.
        for (int i = 0; i < Count; ++i)
        {
            var item = Items[i];
            if (prop.GetValue(item).ToString() == key.ToString()) return i;
        }
        return -1;
    }
}

实现此类后,以下工作

bsOrder.DataSource = new EfBindingList<OrderDto>(lstOrder);
var oldIndex = bsOrder.Find(keyName, id);
于 2020-02-11T22:34:32.433 回答