如何 return 到先前选择的索引 on index change 事件

How to return to the previously selected index on index change event

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

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

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

有没有办法重新select之前的索引and/or取消过渡到新的索引?是否有像 ChangingIndex 这样的事件与 DeletingRecord 与 RecordDeleted 事件的关系类似?

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

如果您使用 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];
    }
}

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

编辑:因为您似乎在 System.Windows.Forms 命名空间中使用 ListBox(没有 SelectionChanged 事件),你可以尝试在你的代码后面有一个 属性 代表 ListBox

的当前 selected 索引

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

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

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
        }
    }

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