怎样撤销ComboBox的选择?

SetMeFree 2012-06-03 11:07:01
就是说,当用户在选择某一项后,会弹出一个对话框,若对话框取消的话,ComboBox回到原来的选择.
我搜索到的方案几乎都是用变量记录当前选择,对话框取消的话就

if (MessageBox.Show("?", "", MessageBoxButtons.OKCancel) == System.Windows.Forms.DialogResult.Cancel)
{
this.comboBox1.SelectedIndex = miCurSel;
}


问题来了,这个撤销动作会再次触发“SelectedIndexChanged”,这不是我想要的。。。
ComboBox 这玩意没实现类似 BeforeIndexChanged 或 SelectedIndexChanging 的事件...
我试过继承 ComboBox,但搞不定。。。

各位英雄可有良策?
...全文
1419 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
stonespace 2012-06-04
  • 打赏
  • 举报
回复
一个简单的方法可以解决这个问题,设置一个bool型变量,表示忽略SelectedIndexChanged事件,假设是bool m_bIgnoreSelectedIndexChanged=false,然后在你的

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (m_bIgnoreSelectedIndexChanged)
return;//直接什么都不做,
miCurSel = comboBox1.SelectedIndex;
}

然后在

if (MessageBox.Show("?", "", MessageBoxButtons.OKCancel) == System.Windows.Forms.DialogResult.Cancel)
{
m_bIgnoreSelectedIndexChanged=true;
this.comboBox1.SelectedIndex = miCurSel;
m_bIgnoreSelectedIndexChanged=false;
}


SetMeFree 2012-06-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
C# code
private Int32 miCurSel;
private void Form1_Load(object sender, EventArgs e)
{
String[] items = {"a","b","c","d","e"};
comboBox1.Items.AddRa……
[/Quote]

你在SelectedIndexChanged 内放个 MessageBox,在按取消之后这个不执行,就是成功了。
试试吧?
SetMeFree 2012-06-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
既然你继承ComboBox,那么你就可以在重写OnSelectedIndexChanged方法的代码中自己去决定是否要调用
base.OnSelectedIndexChanged了!
[/Quote]

我都试过了,关键是在触发之前界面的值已经改了。
你试试?
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

一个简单的方法可以解决这个问题,设置一个bool型变量,表示忽略SelectedIndexChanged事件,假设是bool m_bIgnoreSelectedIndexChanged=false,然后在你的

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
……
[/Quote]
我也是这样想的,虽然不是很华丽没什么章法,但是这解决问题绝对好用
a25856280 2012-06-03
  • 打赏
  • 举报
回复
看不懂
SocketUp 2012-06-03
  • 打赏
  • 举报
回复
        private Int32 miCurSel;
private void Form1_Load(object sender, EventArgs e)
{
String[] items = {"a","b","c","d","e"};
comboBox1.Items.AddRange(items);
comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
comboBox1.SelectedIndex = miCurSel = 0;
}

private void comboBox1_SelectionChangeCommitted(object sender, EventArgs e)
{
if (MessageBox.Show("?", "", MessageBoxButtons.OKCancel) == System.Windows.Forms.DialogResult.Cancel)
{
this.comboBox1.SelectedIndex = miCurSel;
}
}

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
miCurSel = comboBox1.SelectedIndex;
}
  • 打赏
  • 举报
回复
既然你继承ComboBox,那么你就可以在重写OnSelectedIndexChanged方法的代码中自己去决定是否要调用
base.OnSelectedIndexChanged了!
机器人 2012-06-03
  • 打赏
  • 举报
回复
想复杂了,一个标志位就搞定了。判断如果是设回默认值的,就退出处理了。
threenewbee 2012-06-03
  • 打赏
  • 举报
回复
Validating 事件、Validated 事件。

111,095

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧