[C#] Vengono visualizzate entrambe le finestre ComboBox DropDown e Completamento automatico di WinForms


Answers

Aggiungi una singola riga di codice all'evento KeyDown ComboBox e il problema è risolto!

private void comboBox_NameAndID_KeyDown(object sender, KeyEventArgs e)
{
    comboBox_NameAndID.DroppedDown = false;
}

fonte

Question

Ho un ComboBox su un'app winforms con questo codice:

comboBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
comboBox1.AutoCompleteSource = AutoCompleteSource.ListItems;

DataTable t = new DataTable();
t.Columns.Add("ID", typeof(int));
t.Columns.Add("Display", typeof(string));

for (int i = 1; i < 2000; i++)
{
    t.Rows.Add(i, i.ToString("N0"));
}

comboBox1.DataSource = t;
comboBox1.ValueMember = "ID";
comboBox1.DisplayMember = "Display";

Quindi seguire questi passaggi quando si apre la finestra:

  1. Fai clic sul pulsante a discesa ComboBox : questo visualizza l'elenco di elementi e seleziona il testo nel ComboBox
  2. Digita "5", "1" ... cioè sto cercando di utilizzare il completamento automatico per cercare 515, 516, ecc.
  3. Vedrai che la finestra di autocompletamento ora appare SOPRA dell'elenco a discesa. Tuttavia, se passo il mouse, è l'oscurata finestra a tendina dietro la finestra di autocomplete che riceve gli eventi del mouse, incluso il clic. Quindi penso di fare clic su un elemento di completamento automatico, ma in realtà facendo clic su qualcosa di totalmente casuale che non riesco a vedere.

Si tratta di un bug nel ComboBox ? Sto usando Windows 7 se questo è importante. Sto configurando il ComboBox errato in qualche modo?

Si noti inoltre che l'uso della TASTIERA utilizza il menu a discesa del completamento automatico. Quindi i tasti freccia su / giù stanno usando la finestra frontale, ma il mouse sta usando la finestra posteriore.

alt text http://i45.tinypic.com/2zybz92.png




Seleziona il ComboBox dalla vista disegno e imposta "Aggiungi" alla proprietà AutoCompleteMode, questo suggerirà l'elemento senza aprire una finestra.




WinForms ComboBox DropDown ... la risposta è questa ...
scrivi sotto il codice in comboBox1 Inserisci evento ..

private void comboBox1_Enter(object sender, EventArgs e)
{
    comboBox1.DroppedDown = true;
}

Ora per ComboBox1 Completamento automatico ...
scrivi questo AutoComplete() nell'evento di caricamento della pagina..so funziona ...

public void AutoComplete()
{
    try
    {
        MySqlConnection conn = new 
        MySqlConnection("server=localhost;database=databasename;user
            id=root;password=;charset=utf8;");
        MySqlCommand cmd = new MySqlCommand("select distinct
            (columnName) from tablename", conn);
        DataSet ds = new DataSet();
        MySqlDataAdapter da = new MySqlDataAdapter(cmd);
        da.Fill(ds, "tablename");
        AutoCompleteStringCollection col = new
        AutoCompleteStringCollection();

        int i = 0;
        for (i = 0; i <= ds.Tables[0].Rows.Count - 1; i++)
        {
            col.Add(ds.Tables[0].Rows[i]["columnName"].ToString());
        }
        comboBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
        comboBox1.AutoCompleteCustomSource = col;
        comboBox1.AutoCompleteMode = AutoCompleteMode.Suggest;
        if (conn.State == ConnectionState.Open)
        {
            conn.Close();
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK,
    MessageBoxIcon.Error);
    }
}



per avere solo uno aperto alla volta puoi usare comboBox1.Droppeddown = true apri il normale, false il completamento automatico apparirà solo




Aggiungi all'evento / a keypress.

    Dim box As ComboBox = sender
    box.DroppedDown = False