.net 如何在索引更改事件中返回到以前选择的索引

.net 如何在索引更改事件中返回到以前选择的索引,.net,winforms,requiredfieldvalidator,.net,Winforms,Requiredfieldvalidator,我从这个问题引出一个问题:问题答案的第一条评论基本上与我在这里提出的问题相同 它描述了如何捕获索引更改事件。这很好,但是我有一个错误提供程序在等待这个事件,它有效地使某些字段成为必需的。如果它等于true(或者换句话说,强制字段为空),它将退出sub 这很好用;数据保持不变,强制字段突出显示,但问题出现的原因是所选索引已更改。换句话说,您看到的是原始索引中的数据,但组合框中实际突出显示的索引已经更改。事件的ChangedIndex,它在索引更改时激发 我是否可以重新选择以前的索引和/或取消转换到

我从这个问题引出一个问题:问题答案的第一条评论基本上与我在这里提出的问题相同

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

这很好用;数据保持不变,强制字段突出显示,但问题出现的原因是所选索引已更改。换句话说,您看到的是原始索引中的数据,但组合框中实际突出显示的索引已经更改。事件的ChangedIndex,它在索引更改时激发

我是否可以重新选择以前的索引和/或取消转换到新索引?在类似的庄园中是否存在类似于“删除记录”与“已删除记录”事件的“更改索引”事件


编辑-我使用的是列表框,而不是没有SelectedIndexChanged事件的组合框。

如果您使用的是来自
System.Windows.Controls
命名空间的
列表框
,则可以为
列表框添加事件处理程序。SelectionChanged

listBox.SelectionChanged+=新的SelectionChangedEventHandler(listBox\u 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
命名空间中的
列表框
(该命名空间没有
SelectionChanged
事件),因此您可以尝试在代码中保留一个属性,该属性表示当前为
列表框选择的索引

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

考虑过这个问题,我想出了一个简单的解决办法。我只是创建了一个名为“ListBoxIndex”的新变量,并将其作为默认的开始索引。当所有必填字段都已填充且验证函数为true时,我将ListBoxIndex的值设置为listBox.SelectedIndex。当验证返回false时,我只需将listBox.SelectedIndex重置为ListBoxIndex值,从而将其恢复为上一个索引。

我已尝试将其放入代码中,但sysargs似乎没有“RemovedItems”参数。我正在从SelectedIndexChanged事件和VB.net中工作。不确定这是否与此有关?我只能用几个论点,没有一个可以满足我的需要。@Noodlemanny听起来像是在
System.Windows.Forms
命名空间中使用
ListBox
,而不是
System.Windows.Controls
中的,因为您使用的是
SelectedIndexChanged
事件,而不是
SelectionChanged
事件。你必须使用
System.Windows.Forms
名称空间中的列表框吗?@Noodlemanny我更新了我的答案,在
System.Windows.Forms
名称空间中使用
ListBox
包含了一个潜在的解决方案很高兴你成功了!但这不是我上面提到的解决方案吗(唯一的变化是我在
ListBox
上的事件中这样做了,就像你在OP中尝试的那样):公平地说,我没有真正理解您的解决方案,更不用说让它发挥作用了:/Thanway本质上就是您上面所描述的-我在
SelectedIndexChanged
事件中为
ListBox
添加了一个事件处理程序,如果验证函数返回
false
(由
!passedValidation
布尔变量表示),它将
SelectedIndex
设置为
\u current SelectedIndex
变量中保存的索引。如果通过验证,则将
\u current SelectedIndex
中的值更新为更改后的值。哪一部分很难理解?我对其进行了一点更新,但请告诉我是否应该添加更多详细信息以帮助其他人未来也会有类似的问题啊,我想我的主要问题是我不确定_CurrentSelectedIndex的性质。我不清楚它是否是函数、变量等。既然你现在说得更清楚了,我想我可以接受你的答案。