簡體   English   中英

自定義控件-如何在組合框上繪制文本框

[英]Custom Control - How to Draw Textbox on combobox

我正在開發Win Form Application。在我的UI中,我必須制作ComboBox ,該ComboBox僅應首先下拉,但是在選擇任何項目之后,它應該可以部分編輯。

EG選項就像

物品價值-10

物品價值-20

物品價值-30等

現在,如果選擇了“ Item Value - 20 ,則數字20應該是可編輯的(當然是20-29)

但是這里只允許更改數值,而不能更改文本部分。 並且應該只選擇數字部分以使其更加用戶友好。

如果在ComboBox中可能有一些內部屬性可以做到這一點(我想並非如此),那將是直接的方法。

否則,我正在考慮將TextBox准確地繪制/放置在ComboCox

在這種方法中,我不清楚如何精確地放置TextBox以使我的自定義用戶控件看起來像單個單元,並且不與combobox的“ text”部分重疊

我不認為組合框控件應以這種方式使用,因為如果您和用戶必須輸入數據,則簡單的經過驗證的文本框似乎對您和用戶來說是更好的控件。 當然,您可以將所需的所有數字簡單地添加到組合框中,但是用戶必須滾動到所需的數字。 如果此列表很大,那么它將不是非常用戶友好的。 用戶在組合框中鍵入內容的問題與用戶完成鍵入時的操作有關。 即使有建議,當用戶完成在組合框中鍵入內容時,也不會發生任何事情,直到用戶按下Enter鍵。

如果用戶鍵入的內容與列表中的一項相匹配,然后按Enter鍵,則會觸發組合框SelectedIndexChanged事件。 但是,如果用戶鍵入的項目列表中當前未包含的內容Enter鍵,則不會觸發SelectedIndexChanged事件。

使用組合框KeyDown事件,您可以在用戶按下組合框的Enter鍵時捕獲“ EnterKey”,這是用戶無論如何都會選擇現有項的操作。 因此,當用戶鍵入列表中已經存在的內容並按Enter鍵時, KeyDown順序將同時激發SelectedIndexChangedKeyDown事件。 如果用戶鍵入的項目列表中未包含某些內容,則只會觸發KeyDown事件。

使用KeyDown事件檢查所選值是什么。 如果用戶鍵入的項目在項目列表中,那么我們可以忽略它們,因為它們在上一次對SelectedIndexChanged調用中已得到處理。 當用戶鍵入新內容時,顯然您可能需要檢查值的范圍,然后僅使用用戶輸入來調用您的方法。

再次,這似乎很麻煩,而且恕我直言,經過驗證的文本框將使您更容易使用,並且對用戶來說也很簡單,特別是如果他們仍然必須鍵入它。

List<string> comboData;
public Form1() {
  InitializeComponent();
  comboData = new List<string>();
  for (int i = 1; i < 100; i++) {
    comboData.Add(i.ToString());
  }
  comboBox1.DataSource = comboData;
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) {
  MessageBox.Show("selection changed  " + comboBox1.Text);
}
private void comboBox1_KeyDown(object sender, KeyEventArgs e) {
  if (e.KeyCode == Keys.Enter) {
    if (comboData.Contains(comboBox1.Text.ToString())) {
      MessageBox.Show("User entered existing data: " + comboBox1.Text);
      // selection changed event has already handled this, however
      // if the user just pressed "enter" previously
      // then selection changed event wont get fired because the selection did not change
    }
    else {
      MessageBox.Show("User entered NEW data: " + comboBox1.Text);
      // we have data that is NOT currently in the list
      // so selection changed WONT get fired
      // need to call your method with user typed value
    }
  }
}
// make user user only enters numbers
private void comboBox1_KeyPress(object sender, KeyPressEventArgs e) {
  if (!Char.IsNumber(e.KeyChar)) {
    e.Handled = true;
  }
}

注意:我無法確定您的組合項目列表包含的內容。 如果項目中有文本,例如“項目值–”,這似乎是不必要的。 在上面的代碼中,我只是使用了所需的信息,即組合框項目列表中的數字。 另外,我還使用按鍵事件來過濾掉不需要的字母字符。

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM