【问题标题】:How to return to the previously selected index on index change event如何在索引更改事件上返回到先前选择的索引
【发布时间】:2015-01-15 00:26:34
【问题描述】:

我有一个问题来自这个问题:How can I handle ComboBox selected index changing? 问题答案的第一条评论基本上和我在这里问的一样。

它描述了如何捕获索引更改事件。这很好用,但是我有一个错误提供程序正在等待这个事件,它有效地使某些字段成为强制性的。如果它等于 true(或者换句话说,必填字段为空),它将退出 sub。

这很好用;数据保持不变,必填字段被突出显示,但是由于所选索引已经更改,问题就出现了。换句话说,您看到的是原始索引中的数据,但组合框中实际突出显示的索引已经更改。事件的ChangedIndex,当索引改变时触发。

我是否可以重新选择以前的索引和/或取消转换到新索引?是否有像 ChangeIndex 这样的事件,与 DeletingRecord 对 RecordDeleted 事件的含义类似?

编辑-我使用的是 ListBox 而不是没有 SelectedIndexChanging 事件的 ComboBox。

【问题讨论】:

    标签: .net winforms requiredfieldvalidator


    【解决方案1】:

    如果您使用来自System.Windows.Controls 命名空间的ListBox,您可以为ListBox.SelectionChanged 添加事件处理程序:

    listBox.SelectionChanged += new SelectionChangedEventHandler(listBox_SelectionChanged);

    检查您的错误提供程序是否具有 true 值,如果是,我相信这应该可以工作(我对使用相同事件的 ComboBox 控件有类似的逻辑):

    您可以将其添加到事件处理程序中:

    //Check if error provider returned true
    if(hasError)
    {
        //Cast the sender object as ListBox
        ListBox listbox = (ListBox)sender;
    
        //If there was already something selected before, set it as the SelectedItem
        if(e.RemovedItems.Count > 0)
        {
            listBox.SelectedItem = e.RemovedItems[0];
        }
    }
    

    当然,如果您能够选择多个项目,这可能不起作用。

    编辑:由于您似乎在 System.Windows.Forms 命名空间中使用了 ListBox(没有 SelectionChanged 事件),您可以尝试在您后面的代码代表ListBox 的当前选定索引

    在您的 SelectedIndexChanged 事件中,检查您的错误提供程序的条件。如果有错误,则返回保存到您的属性的项目,否则将值更新为新选择的项目。

    不是最优雅的解决方案,但应该可以。

    int _CurrentSelectedIndex = -1; //variable to keep track of the SelectedIndex initialized to default value (-1)
    
    //Add event listener to the ListBox.SelectedIndexChanged event
    ListBox listBox.SelectedIndexChanged += new EventHandler(list_SelectedIndexChanged);
    
    
        //Event handler implementation
        void listbox_SelectedIndexChanged(object sender, EventArgs e)
        {
            //Cast the sender object as ListBox
            ListBox listbox = (ListBox)sender;
    
            //validation function detected an error
            if(!passedValidation)
            {
                listBox.SelectedIndex = _CurrentSelectedIndex; //revert to the previously selected item
            }
    
            //Passed validation - update variable to keep track of the SelectedIndex
            else
            {
                _CurrentSelectedIndex = listBox.SelectedIndex
            }
        }
    

    【讨论】:

    • 我尝试将其放入我的代码中,但似乎 sysargs 没有“RemovedItems”参数。我在 SelectedIndexChanged 事件和 VB.net 中工作。不确定这是否与它有关?
    • 我只能使用几个参数,没有一个能满足我的需要。
    • @Noodlemanny 听起来您在System.Windows.Forms 命名空间中使用ListBox 而不是System.Windows.Controls 中的那个,因为您使用的是SelectedIndexChanged 事件而不是SelectionChanged事件。 System.Windows.Forms中的ListBox一定要使用吗?
    • @Noodlemanny 我更新了我的答案,在ListBox 命名空间中包含了一个潜在的解决方案System.Windows.Forms
    【解决方案2】:

    考虑到这个问题,我想出了一个简单的解决方案。我只是创建了一个名为“ListBoxIndex”的新变量,并为其提供了默认的起始索引。当所有必填字段都填满并且验证功能通过时,我将 ListBoxIndex 的值设置为 listBox.SelectedIndex。当验证返回 false 时,我只需将 listBox.SelectedIndex 重置为 ListBoxIndex 值,从而将其放回之前的索引。

    【讨论】:

    • 很高兴您可以使用它!但这不是我上面的解决方案吗(唯一的变化是我在ListBox 上的一个事件中做到了,就像你在 OP 中尝试的那样)? :p
    • 公平地说,我不太了解您的解决方案,更不用说让它发挥作用了:/ 还是谢谢
    • 基本上就是你上面描述的——我在ListBoxSelectedIndexChanged事件上添加了一个事件处理程序,如果验证函数返回false(由!passedValidation布尔变量表示) ,它将SelectedIndex 设置为保存在_CurrentSelectedIndex 变量中的索引。如果它通过了验证,则将_CurrentSelectedIndex 中的值更新为更改为的值。哪一部分难以理解?我对其进行了一些更新,但请告诉我是否应该添加更多详细信息以帮助将来遇到类似问题的任何人
    • 啊,我认为我的主要问题是我不确定 _CurrentSelectedIndex 的性质。我不清楚它是否是一个函数、变量等。既然你现在说得更清楚了,我想我可以接受你的回答。
    猜你喜欢
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 2020-11-23
    相关资源
    最近更新 更多