2012-10-19 151 views
11

我正在在C#中的自動建議/完成的文本框,我也跟着下面的鏈接,但文本框的心不是顯示的建議文本框自動完成(多線)

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; 

這裏是我的代碼,它在winform的加載功能。 nameCollection初始化在構造函數中...請幫助使其工作。

我正在編輯我的文章,而不是創建新的...我已經嘗試了我自己的代碼在單行文本框中,它的工作。現在我想同樣在多行...對於研究我GOOGLE了兩天以上不同的代碼(一個智能感),但它沒有作爲自動建議在文本框中可用。任何人都可以給我建議將整個過程編碼爲多行。謝謝。

+1

您是否確定當您將'namesCollection'指定爲數據源時,'namesCollection'實際上包含任何條目? – waldrumpus

+1

private AutoCompleteStringCollection namesCollection;這是我用於名稱收集 – greatmajestics

+0

其實我發現問題,這是文本框是多行,而不是單行 – greatmajestics

回答

10

AutoCompleteSource does not work on multiline TextBox controls.

至極意味着你需要從頭使其:

我會做一個列表框顯示的內容您自動完成:

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

您需要eventhandling你的文本框然而,這是一個有點粗糙,所以我把它改寫在某個時候停止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(); 

    } 
} 

現在,所有你需要的是一個處理程序來設置您的文本框中的文本:

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

放在null檢查其中的「自我暗示」,因爲這是混亂的適當

+0

忘了提及這裏的列表是您的自定義自動完成源。在這種情況下,這只是一個列表。 – helgeheldre

+0

謝謝,由於帳戶被暫停,我無法對所有答案表示感謝。 – greatmajestics

+0

列表和textBox2未定義 –

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

請檢查閱讀器獲取所需的記錄.. :)

+0

其實我的代碼工作後,我把它改成單行...但我想知道如何使用對於多行 – greatmajestics

+1

@GreatMajestics:閱讀此鏈接..希望這可以解決您的好奇心。:) http://www.codeproject.com/Articles/5839/DIY-Intellisense –

+0

我已經檢查了以下鏈接。在我的編輯中也提到。但沒有得到如何實現我自己的建議文本框。 – greatmajestics

2

您需要通過「添加到添加新的組件類新物品'。然後寫那個類的代碼,那麼無論需要添加該組件..

+0

給我你的電子郵件ID,我會給你發送代碼.. –

+0

謝謝你的幫助。 – greatmajestics

0

位基本上自動完成沒有用戶的許可來「完成」文本。不過這裏有幾個鏈接,你可能會發現有用:

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

Autocomplete functionality on a textarea

AutoComplete extender for multi-line Textbox

向下滾動鏈路#2,用戶提出一個jQuery的解決方案,並用#1線比較。您可能會找到解決方案。

第三個鏈接是來自asp論壇,像你這樣的類似問題也通過鏈接回答。你可能想檢查一下。

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