2012-10-19 10 views
11

Robię autosugestia/kompletne pole tekstowe w języku C#, i następnie poniżej linku, ale pole tekstowe nie jest wyświetlana sugestiamitekstowe auto kompletne (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; 

Oto mój kod , jest w funkcji ładowania winform. Nazwa inicjująca kolekcję jest w konstruktorze ... prosimy, pomóżcie, aby to działało.

Edytuję mój wpis, a następnie tworzę nowy ... Próbowałem swój własny kod w polu tekstowym pojedynczej linii i zadziałało. Teraz chcę to samo w wielu liniach ... Dla badań i googled więcej niż 2 dni próbowałem różnych kodów (jeden z intelli sens), ale nie działało jako automatyczna sugestia dostępna w polu tekstowym. Czy ktoś może dać mi sugestię, aby zakodować całą procedurę na multi-line .. Dziękuję.

+1

Czy masz pewność, że 'namesCollection' rzeczywiście zawiera jakiekolwiek wpisy, gdy przypisujesz je jako źródło danych? – waldrumpus

+1

prywatne AutoCompleteStringCollection namesCollection; to jest to, czego używam do zbierania nazw – greatmajestics

+0

Właściwie znalazłem problem, jest to pole tekstowe jest wieloliniowe, a następnie pojedyncza linia – greatmajestics

Odpowiedz

10

AutoCompleteSource does not work on multiline TextBox controls.

Wich oznacza, że ​​trzeba to zrobić od podstaw:

chciałbym zrobić ListBox, aby wyświetlić zawartość Twój autouzupełnianie:

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

trzeba eventhandling na tekstowym jest to jednak nieco surowy, więc chciałbym przerobić go zatrzymać keyupevent w pewnym momencie:

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

    } 
} 

Teraz wszystko, czego potrzebujesz to handler ustawić tekst w polu tekstowym:

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

Put in kontroli zerowych w stosownych przypadkach

+0

Zapomniałem wspomnieć, że lista zawiera własne niestandardowe źródło autouzupełniania. Który w tym przypadku jest po prostu listą . – helgeheldre

+0

Dziękuję, nie mogliśmy podziękować za wszystkie odpowiedzi z powodu zawieszenia konta. – greatmajestics

+0

lista i tekstBox2 nie jest zdefiniowany –

1

Spróbuj tego kodu, jak to działa w moim przypadku:

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

Proszę sprawdzić, czy czytnik jest uzyskiwanie pożądanych rekordy .. :)

+0

Właściwie mój kod pracował po tym, jak zmieniłem go w pojedynczą linię ... Nadal chcę wiedzieć, jak tego użyć dla wielu linii – greatmajestics

+1

@GreatMajestics: PRZECZYTAJ TEN LINK..Może to rozwiąże twoją ciekawość. :=) http://www.codeproject.com/Articles/5839/DIY-Intellisense –

+0

Już sprawdziłem poniższy link. Również wspomniałem w mojej edycji. Ale nie udało mi się wdrożyć własnego pola tekstowego sugestii. – greatmajestics

2

Trzeba dodać klasę nowego komponentu przez „Dodawanie Nowa pozycja ". a następnie napisać kod dla tej klasy, a następnie dodać ten element gdziekolwiek wymagane ..

+0

wyślij mi swój identyfikator e-mail, a wyślę Ci kod. –

+0

Dziękuję za pomoc. – greatmajestics

0

trochę zamieszania na „auto-sugestii”, ponieważ jest to zasadniczo autouzupełnianie bez zgody użytkownika na "uzupełnienie" tekstu. Niemniej jednak tutaj kilka linków może pomocne znaleźć:

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

Autocomplete functionality on a textarea

AutoComplete extender for multi-line Textbox

Przewiń na link # 2, użytkownik zasugerował rozwiązanie jquery i porównać link # 1 . Możesz znaleźć rozwiązanie.

Trzecie łącze jest z forów asp, podobne pytanie jak twoje również zostało odebrane linkiem. Możesz to sprawdzić.

0

Pomóż w rozwiązaniu problemu; Możesz zmienić nazwę tabeli. możesz zmienić zapytanie, aby załadować listę list.

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(); 
    } 
Powiązane problemy