繁体   English   中英

C#组合框选择的索引更改会触发旧值

[英]C# combobox selected index changed fires old value

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

因此,有两个问题:如果组合框是窗体上的选定控件,为什么为什么用旧值触发了selectedIndexChanged事件,以及如何避免这种情况或者如果我不能找到一个好的解决方法? 进一步是一些代码来说明我的问题。 如果在窗体上放置一个组合框和一个RTF框,然后将以下代码复制到Form1.cs中,则可以看到我的问题。 您需要组合使用DropDownList Style并添加一些数字作为项目(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));
    }
}

这是由于以下事实造成的:默认情况下,如果组合框具有焦点,则按向左和向右(无控制)将更改该值。

您正在捕捉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方法设置的,并且仅在直接访问时运行选定的索引更改事件。 只是一个想法。

加载表单时,如果有大量与组合框和列表相关的事件发生,则我们会执行类似的操作。 我们正在设置值,并且不希望事件在加载过程中触发,因此我们有一个标志来阻止事件在表单加载完成之前触发。

我的想法是您正在设置值,但其他原因则迫使第二次selectitem更改事件发生。 但是,由于您在DoUpdate方法和SetComboValue方法中设置了selectedindex,因此您似乎也陷入了一个无限循环。

只需在一处更改所选索引。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM