繁体   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