0

私はEntity FrameworkとLINQを使用するWindowsフォームアプリケーションを持っています.BindingNavigatorを使用してデータをナビゲートする多くのフォームがあり、ナビゲーターにテキストボックスを追加して特定のアイテムを検索し、それにナビゲートしたい.からですが、他のフォームに対して同じ手順を実行し、すべてのフォームに同じイベントとコードを追加する必要があるため、カスタム ToolStripTextBox を作成し、代わりにすべてのフォームで使用することにしましたが、汎用にする必要があります異なるオブジェクトまたはエンティティを使用するすべてのフォームと、これが私が思いついたものだからです:

class ToolStripSearchBox<T> : ToolStripTextBox
{
    BindingSource dataSource;
    int currentIndex;

    public ToolStripSearchBox()
        : base()
    {
        KeyUp += new KeyEventHandler(ToolStripSearchBox_KeyUp);
    }

    void ToolStripSearchBox_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.F4)
        {
            string patern = Text;
            List<T> TList = dataSource.List.Cast<T>().ToList();
            int res = 0;
            T foundT = default(T);

            if (int.TryParse(patern, out res))
            {
                foundT = TList.Where(j => j. == res).First();

            }
            else
            {
                foundT = TList.First(j => (j.FirstName + " " + j.LastName).Contains(patern));
            }
            if (foundT == null)
            {
                return;
            }

            dataSource.Position = dataSource.IndexOf(foundT);
        }
    }
}

しかし、問題は、すべてのエンティティにフィルター処理する異なるプロパティがあることです。文字列パラメーターを使用してオブジェクトのプロパティ名を渡すことを考えていましたが、LINQ で使用する方法が見つかりませんでした。

口述ミスがある場合は申し訳ありませんが、英語は私の母国語ではありません よろしくお願いします

4

1 に答える 1

1

あなたのコードで私が見ているものについては、「すべてのエンティティにはフィルタリングするための異なるプロパティがあります」とはFirstNameLastName、 などのプロパティを意味します。

その場合は、マッチャーとして使用するジェネリック関数オブジェクトを簡単に定義できます。これは、構築時または初期化中に指定できます。(パラメーターのないコンストラクターを持つコンポーネントはあまり好きではありません。)

class ToolStripSearchBox<T> {
    public Func<T, string, bool> Matcher { get; set; }
}

たとえば、 を検索するためのこれらのボックスの 1 つの初期化中にFoo、次のようにします。

ToolStripSearchBox<Foo> fooSearchBox = new ToolStripSearchBox<Foo>();
fooSearchBox.Matcher = (j, pattern) => (j.Second + " " + j.Second).Contains(pattern);

とはいえ、コードには多くの問題がありますFirst()。要素が見つからない場合、拡張メソッドは例外をスローすることに注意してください。使用してFirstOrDefault()ください。あなたもfoundT == null.. を使用していることがわかります。それがコンパイルされるとは思えません。foundT == default(T)代わりに行います。

class ToolStripSearchBox<T> {

    void ToolStripSearchBox_KeyUp(object sender, KeyEventArgs e)
    {
        ...
            foundT = TList.FirstOrDefault(this.Matcher(j, patern));
        ...
    }
}
于 2012-09-18T18:34:48.667 に答える