2010-10-03 104 views
2

有沒有辦法讓windows窗體組合框只讀? 具體說明:用戶應該可以輸入,但只允許輸入框中的值(使用自動完成或從列表中選擇)。只讀Windows窗體組合框

或者是使用驗證事件的唯一方法?

問候

馬里奧

回答

3

您可以設置DropDownStyle爲DropDownList,但並沒有真正讓打字(但它允許用鍵盤選擇)。

如果您確實希望用戶能夠鍵入/查看不完整的單詞,則必須使用事件。驗證事件將是最佳選擇。

+0

謝謝!我只是想我可以不用自己編碼...猜猜我的另一個庫組件... – 2010-10-03 13:59:23

3

如果您在用戶鍵入內容時設置了AutoCompleteMode = SuggestAppendAutoCompleteSource = ListItems,則自動顯示以打字字符開頭的條目。

然後通過處理SelectedIndexChangedSelectedValueChanged事件,您將能夠在用戶鍵入值列表中的某個值時截取。

如果你也絕對不希望用戶輸入任何東西,這不是在列表中,那麼是的,你必須處理例如KeyDown事件,如:

private void comboBox1_KeyDown(object sender, KeyEventArgs e) 
{ 
    char ch = (char)e.KeyValue; 
    if (!char.IsControl(ch)) 
    { 
     string newTxt = this.comboBox1.Text + ch; 
     bool found = false; 
     foreach (var item in this.comboBox1.Items) 
     { 
      string itemString = item.ToString(); 
      if (itemString.StartsWith(newTxt, StringComparison.CurrentCultureIgnoreCase)) 
      { 
       found = true; 
       break; 
      } 
     } 
     if (!found) 
      e.SuppressKeyPress = true; 
    } 
} 
+0

謝謝,我害怕我必須這樣做! – 2010-10-03 13:58:38

0

感謝。除了KeyDown事件代碼之外,上面的方法適用於我。因爲組合框附加到DataTable。如果將組合框附加到DataTable上,請嘗試下面的代碼,並且如果您也絕對不希望用戶鍵入不在列表中的任何內容。

private void cmbCountry_KeyDown(object sender, KeyEventArgs e) 
    { 
     char ch = (char)e.KeyValue; 
     if (!char.IsControl(ch)) 
     { 
      string newTxt = this.cmbCountry.Text + ch; 
      bool found = false; 
      foreach (var item in cmbCountry.Items) 
      { 
       DataRowView row = item as DataRowView; 
       if (row != null) 
       { 
        string itemString = row.Row.ItemArray[0].ToString(); 
        if (itemString.StartsWith(newTxt,  StringComparison.CurrentCultureIgnoreCase)) 
        { 
         found = true; 
         break; 
        } 
       } 
       else 
        e.SuppressKeyPress = true; 
      } 
      if (!found) 
       e.SuppressKeyPress = true; 
     } 
    } 
相關問題