![](/img/trans.png)
[英]How to use a custom style trigger to draw a Line in a TextBox control
[英]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
順序將同時激發SelectedIndexChanged
和KeyDown
事件。 如果用戶鍵入的項目列表中未包含某些內容,則只會觸發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.