我有一个用户控件,它有一个ComboBox和一个SelectedIndexChanged事件处理程序。在事件处理程序中,我需要能够分辨出之前选择的索引是什么...有人能指出我正确的方向吗?
private void cboTargetMode_SelectedIndexChanged(object sender, EventArgs e)
{
// need to get the previously selected index and do some handling here...
// ... some handler code here ...
switch (cboTargetMode.SelectedIndex)
{
case 1: // ..... some code here...
break;
case 2: // ..... some code here...
break;
case 3: // ..... some code here...
break;
default: // ..... some code here...
break;
}
}
答案 0 :(得分:23)
内置任何内容,您将需要侦听此事件并在实例变量中跟踪。
使用-1作为未初始化的“最后一个索引”,因此在第一次传递时设置它但不使用它。随后的传球你使用它并设置它。
您始终可以使用自己的派生ComboBox类来覆盖OnSelectedIndexChanged
并公开PreviousSelectedIndex
属性。这样,它就不会与表单紧密耦合。或者,正如您可以使用事件一样,它也可以作为extender provider实现。
答案 1 :(得分:3)
我猜你必须将当前的(将在之后的版本中)存储到一个变量中,以便它像缓存一样使用。
private void cboTargetMode_SelectedIndexChanged(object sender, EventArgs e) {
// need to get the previously selected index and do some handling here...
// ... some handler code here ...
// Assuming that the variable PreviousSelectedIndex is declared in the class with value -1.
if (PreviousSelectedIndex < 0)
PreviousSelectedIndex = cbo.TargetMode.SelectedIndex;
else
// Do some handling here...
switch (cboTargetMode.SelectedIndex) {
case 1: // ..... some code here...
break;
case 2: // ..... some code here...
break;
case 3: // ..... some code here...
break;
default: // ..... some code here...
break;
}
}
这是你已经想过的吗?
否则,也许正在处理Control.Validating
事件?我只是不能说这个事件是在SelectedIndexChanged
事件之前还是之后发生的。 =(
答案 2 :(得分:0)
comboBox_SelectionChangeCommitted事件怎么样?选择完成后调用此选项,菜单将折叠,但项目未完全更改。所以只需阅读comboBox.SelectedText或comboBox.SelectedValue甚至comboBox.SelectedIndex
private void comboBox1_SelectionChangeCommitted(object sender, EventArgs e)
{
int prevIndex = comboBox1.SelectedIndex;
}
答案 3 :(得分:0)
这个获取当前选定的索引,我只需要它,我找不到任何地方,所以我希望它有所帮助
private void lsbx_layers_SelectedIndexChanged(object sender, EventArgs e)
{
int i = lsbx_layers.SelectedIndices[0];//selected index
MessageBox.Show("Selected item at index : " + i);
}
答案 4 :(得分:0)
我遇到了类似的问题,我将所有的组合框设置为&#34; autocomplete&#34;使用
ComboBox.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
ComboBox.AutoCompleteSource = AutoCompleteSource.ListItems;
我循环播放并设置所有lostFocus事件:
foreach(Control control in this.Controls)
{
if(control is ComboBox)
{
((ComboBox)control).LostFocus += ComboBox_LostFocus;
}
}
并有一个字典对象来保存旧值
public Dictionary<string, int> comboBoxOldValues = new Dictionary<string, int>();
然后最后确保值存在或设置为旧索引,然后保存到字典
private void ComboBox_LostFocus(object sender, EventArgs e)
{
ComboBox comboBox = (ComboBox)sender;
if (comboBox.DataSource is List<YourDataType>)
{
if (((List<YourDataType>)comboBox.DataSource).Count(x => x.YourValueMember == (YourValueMemberType)comboBox.SelectedValue) == 0)
{
if (comboBoxOldValues.Keys.Count(x => x == comboBox.Name) > 0)
{
comboBox.SelectedIndex = comboBoxOldValues[comboBox.Name];
}
else
comboBox.SelectedIndex = -1;
}
}
if (comboBoxOldValues.Keys.Count(x => x == comboBox.Name) > 0)
{
comboBoxOldValues[comboBox.Name] = comboBox.SelectedIndex;
}
else
comboBoxOldValues.Add(comboBox.Name, comboBox.SelectedIndex);
if (comboBox.SelectedIndex == -1)
comboBox.Text = string.Empty;
}
答案 5 :(得分:0)
您可以获取旧值并将其存储在DropDown
事件中。然后在SelectionChangeCommitted
事件(如果有保证)中还原为该旧值。