11

C#で自動提案/完全なテキストボックスを作成しています。以下のリンクをたどりましたが、テキストボックスに提案が表示されません

Windowsフォームでオートサジェストテキストボックスを作成するにはどうすればよいですか?

//-------- Get all distinct description -----------------------------
OleDbCommand command = new OleDbCommand(Queries.qry16, Connection);
OleDbDataReader reader = command.ExecuteReader();

//--------- Storing ------------------------------------
while (reader.Read())
{
    namesCollection.Add(reader.GetValue(0).ToString());
}

//----------- Close after use ---------------------------------------
reader.Close();

//----------- Set the auto suggestion in description box ------------
descriptionBox.AutoCompleteMode = AutoCompleteMode.Suggest;
descriptionBox.AutoCompleteSource = AutoCompleteSource.CustomSource;
descriptionBox.AutoCompleteCustomSource = namesCollection;

これが私のコードです、それはwinformのロード関数にあります。そして、nameCollectionの初期化はコンストラクターにあります...親切にそれを機能させるのを手伝ってください。

新しい投稿を作成するのではなく、投稿を編集しています... 1行のテキストボックスで自分のコードを試しましたが、機能しました。今、私は複数行で同じものが欲しいです...研究のために、私は異なるコード(インテリセンスを持つもの)を試して2日以上グーグルで検索しましたが、テキストボックスで利用可能な自動提案としては機能しませんでした。手順全体を複数行にコーディングする提案を誰かに教えてもらえますか。ありがとうございます。

4

5 に答える 5

13

AutoCompleteSourceは、複数行のTextBoxコントロールでは機能しません。

Wichは、最初から作成する必要があることを意味します。

オートコンプリートの内容を表示するリストボックスを作成します。

var listBox = new ListBox();
Controls.Add(listBox);

テキストボックスでイベント処理が必要ですが、これは少し粗雑なので、ある時点でkeyupeventを停止するように書き直します。

private void textBox_KeyUp(object sender, KeyEventArgs e)
{
    var x = textBox.Left;
    var y = textBox.Top + textBox.Height;
    var width = textBox.Width + 20;
    const int height = 40;

    listBox.SetBounds(x, y, width, height );
    listBox.KeyDown += listBox_SelectedIndexChanged;

    List<string> localList = list.Where(z => z.StartsWith(textBox.Text)).ToList();
    if(localList.Any() && !string.IsNullOrEmpty(textBox.Text))
    {
        listBox.DataSource = localList;
        listBox.Show();
        listBox.Focus();

    }
}

これで必要なのは、textBoxにテキストを設定するためのハンドラーだけです。

 void listBox_SelectedIndexChanged(object sender, KeyEventArgs e)
    {
        if(e.KeyValue == (decimal) Keys.Enter)
        {
            textBox2.Text = ((ListBox)sender).SelectedItem.ToString();
            listBox.Hide();                
        }
    }

必要に応じてnullチェックを入れます

于 2012-11-06T12:54:13.733 に答える
2

「新しいアイテムの追加」によって新しいコンポーネントクラスを追加する必要があります。次に、そのクラスのコードを記述し、必要に応じてそのコンポーネントを追加します。

于 2012-11-05T10:44:39.023 に答える
1

私の場合は、次のコードを試してみてください。

  AutoCompleteStringCollection MyCollection = new AutoCompleteStringCollection();
                while (reader.Read())
                {
                    namesCollection.Add(reader.GetString(0));
                }
                reader.Close();
    descriptionBox.AutoCompleteMode = AutoCompleteMode.Suggest;
descriptionBox.AutoCompleteSource = AutoCompleteSource.CustomSource;    
                descriptionBox.AutoCompleteCustomSource = namesCollection;
                con.Close();

リーダーが目的のレコードを取得しているかどうかを確認してください。.:)

于 2012-10-19T11:28:17.317 に答える
0

「自動提案」は基本的にユーザーの許可なしに自動補完されるため、少し混乱します。それにもかかわらず、ここにあなたが役立つと思うかもしれないいくつかのリンクがあります:

http://docs.jquery.com/UI/Autocomplete

テキストエリアのオートコンプリート機能

複数行のテキストボックス用のオートコンプリートエクステンダー

リンク#2を下にスクロールすると、ユーザーがjqueryソリューションを提案し、リンク#1と比較します。あなたは解決策を見つけるかもしれません。

3番目のリンクはaspフォーラムからのもので、あなたのような同様の質問にもリンクがあります。あなたはそれをチェックしたいかもしれません。

于 2012-11-10T14:55:01.777 に答える
0

これは問題の解決に役立つかもしれません; テーブル名は変更できます。リストボックスをロードするようにクエリを変更できます。

    ListBox lbox;
    private void IletisimBilgileriDoldur()
    {
        try
        {
            string strQuery= "Select adres From tblIletisimBilgileri Where adres <> '';";
            veri = new OleDbCommand(strQuery,strConn);
            veri.CommandType = CommandType.Text;
            if (strConn.State == ConnectionState.Closed) strConn.Open();
            oku = veri.ExecuteReader();
            DataTable dt = new DataTable();
            dt.Load(oku);
            oku.Close();
            txtAdres.AutoCompleteCustomSource.Clear();
            if (dt.Rows.Count >= 0)
            {
                lbox = new ListBox();
                for (int count = 0; count < dt.Rows.Count; count++)
                {
                    lbox.Items.Add(dt.Rows[count]["adres"].ToString());
                }
            }
            txtAdres.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
            txtAdres.AutoCompleteSource = AutoCompleteSource.CustomSource;
            if (strConn.State == ConnectionState.Open) strConn.Close();
        }
        catch (Exception)
        {
            if (strConn.State == ConnectionState.Open) strConn.Close();
        }
    }

    private void txtAdres_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
    {
        var x = txtAdres.Left;
        var y = txtAdres.Top + txtAdres.Height;
        var width = txtAdres.Width;
        const int height = 120;

        lbox.SetBounds(x, y, width, height);
        lbox.KeyDown += lbox_SelectedIndexChanged;
        lbox.DoubleClick += lbox_DoubleClick;
        gbxAdres.Controls.Add(lbox);
        lbox.BringToFront();
        lbox.Show();
        ActiveControl = txtAdres;
    }

    void lbox_DoubleClick(object sender, EventArgs e)
    {
        txtAdres.Text = ((ListBox)sender).SelectedItem.ToString();
        lbox.Hide();
    }
于 2013-10-12T10:34:27.203 に答える