5

データソースとしてが添付されていますBindingSource。のメソッドを使用して要素を検索しBindingList<Foo>たいと思います。ただし、次のことを行うと、データソースが実装されていても(そしてそのような例外はMSDNに文書化されていません)、aがスローされます。BindingSourceFindNotSupportedExceptionIBindingList

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

以下に短い例を添付しました(a ListBox、a Button、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でFindをどのように機能させるかです。

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 に答える