0

テキスト ボックスに似た Windows フォーム コントロールを C# で実装しようとしています。ユーザーが 3 文字以上入力すると、データソースに対して検索が実行されます。複数のフィールドが返されます (可能な定義の 1 つとして、以下のクラス構造を参照してください)。

public class MyStructure
{
    public int Value1 { get; set; }
    public string Value2 { get; set; }
    public string Value3 {get; set; }
}

私の要件は、複数の列を含むオートコンプリート リストを表示することです (注: これは、連結されたリストからの埋め込みフィールドを含む文字列にすることができます)。ユーザーがすべての文字を入力するか、下向き矢印を押してアイテムを選択するか、Enter キーを押すと、テキスト ボックスの値がリストの ValueMember を取得します (リストの DisplayMember はデータ ソース全体になります)。ユーザーが入力する上矢印または下矢印または Enter キー以外のすべてのキーストロークは、別の検索を実行し、リストを更新します。

自動提案で単一の列を持つテキストボックスを実装する方法を見てきましたが、複数の列に対してこれを行う方法の比較的「単純な」例が見つかりません。コントロールは、テキスト ボックスに似たスタイルのテキスト ボックスまたはコンボ ボックス (可能な場合) またはユーザー コントロールである必要がありますか?

キーストロークを監視するイベントは、TextEntered イベントまたは KeyPress イベントのどちらにする必要がありますか? 入力した内容に影響を与えずに AutoCompleteStringCollection をリセットできますか?

フレームワーク4.0以降でこれを行う方法の例を誰かが提供できますか、または例を教えてもらえますか?

EDIT 1: 多くの検索の結果、基本的に TextBox に ContextMenuStrip を実装する必要があることがわかりました (ユーザー コントロールの下にあるその他のコントロールはすべて重複します)。私の問題は、Tab や Enter などのキー プレス イベントを処理する方法を判断できないことです。さらに、ユーザーが入力を続けるかどうかを処理する必要があります (このイベントでは、フォーカスをテキスト ボックスに戻し、キーを追加したいと考えています)。以下は私のコードです:

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        ContextMenuStrip menuStrip;
        string szMenuItem = string.Empty;

        // This would actually be a call to a web service
        List<MStarDeal> deals = DealInfo.Where(i => i.Value1.StartsWith(textBox1.Text.ToUpper()) || i.Value2.StartsWith(textBox1.Text.ToUpper()) || i.Value3.StartsWith(textBox1.Text.ToUpper()))
            .Select(i => i).ToList();

        if (textBox1.Text.Length >= 3 && !bSelected)
        {
            menuStrip = new System.Windows.Forms.ContextMenuStrip();

            foreach (MStarDeal item in deals)
            {
                szMenuItem = item.Value1.PadRight(15) + item.Value2.PadRight(20) + item.Value3.PadRight(80);

                ToolStripItem tsItem = new ToolStripMenuItem();
                tsItem.Text = szMenuItem;
                tsItem.Name = item.Value1;
                tsItem.MouseUp += tsItem_MouseUp;
                menuStrip.Items.Add(tsItem);
            }

            textBox1.ContextMenuStrip = menuStrip;
            textBox1.ContextMenuStrip.Show(textBox1, new Point(0, 20));
        }
        else if (bSelected)
        {
            bSelected = false;
        }
    }

    void tsItem_MouseUp(object sender, EventArgs e)
    {
        bSelected = true;
        textBox1.Text = ((ToolStripMenuItem)sender).Name;
    }

ありがとう、

リー

4

1 に答える 1

0

私はあなたの質問を理解していると思います。KeyPress の代わりに TextChanged() イベントを使用するのはどうですか? 列に関しては、flowLayoutPanel は、正しい方向にフローするように設定し、そのサイズを 2 つの列を組み合わせた幅に適切にすると、列をレンダリングします。

于 2013-11-09T04:30:04.893 に答える