C#combobox选择的索引更改了旧的值

当我想通过使用Ctrl-Left ori Ctrl-Right更改Windows窗体应用程序中组合框的选定值时,我遇到了一种情况。 但是,如果组合框是窗体上的选定控件,则不起作用。 设置为新值后,所选值将被设置为旧值。 如果组合框不是选定的控件,那么一切正常。 在我的应用程序中,组合可以获得焦点,因为值也可以用鼠标改变。 虽然我想要的可以通过在实际更改值之前选择其他控件来完成,但我不太喜欢这个解决方案。

因此,有两个问题:如果组合框是窗体上的选定控件,为什么用旧值触发selectedIndexChanged事件?如何避免这种情况,或者如果我不能解决什么问题? 还有一些代码来说明我的问题。 如果在窗体上放置组合框和richtext框,并将下面的代码复制到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} rn", value.ToString()));         
    }

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        richTextBox1.AppendText(string.Format("Selected index changed before {0}rn", comboBox1.SelectedItem));
        SetComboValue(Convert.ToInt32(comboBox1.SelectedItem));
        richTextBox1.AppendText(string.Format("Selected index changed after {0}rn", comboBox1.SelectedItem));
    }
}

这是由于默认情况下,如果组合框具有焦点,则按左右(无控制)会改变该值。

您正在捕捉ctrl-left,将值递增......然后将按键传递给基础对象,该基础对象解释左按键并递减所选项目。

改变你的代码如下,吞下按键,事情似乎按预期工作:

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if (keyData == (Keys.Control | Keys.Left))
        {
            DoUpdate();
            return true;
        }
        else
        {
            return base.ProcessCmdKey(ref msg, keyData);
        }
    }

为什么不直接从DoUpdate方法运行SetComboValue方法? 如果这不起作用,您可以始终设置一个标志,说明它是从DoUpdate方法设置的,并且仅在直接访问时才运行所选索引更改事件。 只是一个想法。

当我们在加载表单的过程中遇到一系列与组合框和列表相关的事件时,我们会做类似的事情。 我们正在设置值,并且不希望事件在加载期间触发,因此我们有一个标志可以防止事件发生,直到表单加载完成。

我的想法是,你正在设定的价值,但其他事情正在迫使第二个selecteditem更改事件发生。 但是,由于您在DoUpdate方法和SetComboValue方法中设置了selectedindex,因此它看起来也可能进入无限循环。

只需在一个地方更改选定的索引。

链接地址: http://www.djcxy.com/p/68589.html

上一篇: C# combobox selected index changed fires old value

下一篇: Winforms combobox loses autocomplete value on lostfocus