2012-10-19 12 views
11

sto facendo un suggerimento automatico/testo completo in C#, ho seguito sotto collegamento, ma casella di testo non sta mostrando i suggerimentitextbox completamento automatico (Multi Line)

How to create autosuggest textbox in windows forms?

//-------- 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; 

Ecco il mio codice , è nella funzione di caricamento di winform. E l'inizializzazione nameCollection è in constructor ... gentilmente, per favore, aiutaci a farlo funzionare.

Sto modificando il mio post piuttosto che creando nuovo ... Ho provato il mio codice nella casella di testo a riga singola e ha funzionato. Ora voglio lo stesso in multi linea ... Per la ricerca ho cercato su Google più di 2 giorni provando diversi codici (uno con senso intelli) ma non ha funzionato come suggerimento automatico disponibile nella casella di testo. Qualcuno può darmi un suggerimento per codificare l'intera procedura in multi linea .. Grazie.

+1

Hai fatto in modo che 'namesCollection' contenga effettivamente delle voci quando lo assegni come origine dati? – waldrumpus

+1

private AutoCompleteStringCollection namesCollection; questo è quello che sto usando per la raccolta di nomi – greatmajestics

+0

In realtà ho trovato il problema, è la casella di testo è multi linea anziché singola riga – greatmajestics

risposta

10

AutoCompleteSource does not work on multiline TextBox controls.

Quale significa che è necessario per rendere nuovamente da zero:

vorrei fare un ListBox per visualizzare il contenuto di il vostro completamento automatico:

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

è necessario eventhandling sulla vostra casella di testo tuttavia questo è un po 'grezza, quindi vorrei riscriverla per fermare la keyupevent ad un certo punto:

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(); 

    } 
} 

Ora tutto ciò che serve è un gestore per impostare il testo nella vostra casella di testo:

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

Put nei controlli nulli se del caso

+0

Hai dimenticato di menzionare che l'elenco qui è la tua fonte di completamento automatico personalizzata. Che in questo caso è solo un elenco . – helgeheldre

+0

Grazie, non ho potuto dire grazie per tutte le risposte a causa della sospensione dell'account. – greatmajestics

+0

elenco e textBox2 non sono definiti –

1

Prova questo codice come funziona nel mio caso:

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(); 

Si prega di verificare se il lettore è sempre i record desiderati .. :)

+0

In realtà il mio codice ha funzionato dopo averlo modificato in una sola riga ... Ancora voglio sapere come usarlo per multi linea – greatmajestics

+1

@GreatMajestics: LEGGI QUESTO LINK..Questo risolve la tua curiosità.:=) http://www.codeproject.com/Articles/5839/DIY-Intellisense –

+0

Ho già controllato il seguente link. Anche menzionato nella mia modifica. Ma non ha avuto modo di implementare la mia casella di testo di suggerimento. – greatmajestics

2

È necessario aggiungere una classe nuovo componente da 'Aggiunta Nuovo oggetto'. e poi scrivere il codice per quella classe e quindi aggiungere tale componente ovunque necessario ..

+0

inviami il tuo ID e-mail e ti invierò il codice .. –

+0

Grazie per l'aiuto. – greatmajestics

0

po 'di confusione da "auto-suggestione" dal momento che è fondamentalmente auto-completo senza il permesso dell'utente di "completare" il testo. Tuttavia qui ci sono un paio di link vi possono essere utili:

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

Autocomplete functionality on a textarea

AutoComplete extender for multi-line Textbox

Scorrere verso il basso sul link n 2, un utente ha suggerito una soluzione di jQuery e confrontare con il collegamento # 1 . Potresti trovare una soluzione.

Il terzo link proviene dai forum di asp, una domanda simile come la tua è stata anche risolta da un collegamento. Potresti voler controllare.

0

Questo può aiutare a risolvere il problema; È possibile modificare il nome della tabella. puoi cambiare la query per caricare listbox.

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(); 
    } 
Problemi correlati