【发布时间】:2009-12-18 11:25:45
【问题描述】:
我有一种情况,我想通过使用 Ctrl-Left 或 Ctrl-Right 来更改 Windows 窗体应用程序中组合框的选定值。但是,如果组合框是窗体上的选定控件,则此方法不起作用。选定的值在设置为新值后设置为旧值。如果组合框不是选定的控件,那么一切正常。在我的应用程序中,组合可以接收焦点,因为这些值也可以用鼠标更改。虽然我想要的可以通过在实际更改值之前在表单上选择一些其他控件来完成,但我不太喜欢这个解决方案。
所以,有两个问题:如果组合框是窗体上的选定控件,为什么 selectedIndexChanged 事件会使用旧值触发? 如何避免这种情况,或者如果我不能,什么是好的解决方法?还有一些代码来说明我的问题。如果您在表单上放置一个组合框和一个富文本框并在 Form1.cs 中复制以下代码,您可以看到我的问题。您需要制作组合 DropDownList 样式并添加一些数字作为项目(1、2、3 很好)
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
comboBox1.SelectedIndex = 0;
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == (Keys.Control | Keys.Left))
{
DoUpdate();
}
return base.ProcessCmdKey(ref msg, keyData);
}
private void DoUpdate()
{
int index = Convert.ToInt32(comboBox1.SelectedItem);
index++;
if (comboBox1.Focused)
richTextBox1.Select();
comboBox1.SelectedItem = index.ToString();
}
private void SetComboValue(int value)
{
comboBox1.SelectedItem = value.ToString();
richTextBox1.AppendText(string.Format("Set value {0} \r\n", value.ToString()));
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
richTextBox1.AppendText(string.Format("Selected index changed before {0}\r\n", comboBox1.SelectedItem));
SetComboValue(Convert.ToInt32(comboBox1.SelectedItem));
richTextBox1.AppendText(string.Format("Selected index changed after {0}\r\n", comboBox1.SelectedItem));
}
}
【问题讨论】:
-
如何使用适当的方法获取组合框索引:SelectedIndex。这样能解决吗?