出现的问题:
ListBox 中给了它一个这样的事件SelectionChanged="NumBasket_SelectionChanged" 也就是单击某行就会触发的事件,要实现的效果是,单击此行时,此行的信息移除
本以为写这行代码可以实现效果:
'已经选号变动 Private Sub NumBasket_SelectionChanged(sender As System.Object, e As System.Windows.Controls.SelectionChangedEventArgs) If NumBasket.Items.Count > 0 Then NumBasket.Items.RemoveAt(NumBasket.SelectedIndex) 'NumBasket.Items.Remove(NumBasket.SelectedItem) End If End Sub
事实是,如果只有一行数据的话不会出什么问题,但是如果有两行就抛出异常了,异常为:
问题分析:现在没找到相关的解释,只是看到这个错误提示。。。。
解决方案:
看到别人是这样处理的:
delegate void DeleteSelected(object item); bool isSysSet = false; private void NumBasket_SelectionChanged(object sender, RoutedEventArgs e) { //if (NumBasket.Items.Count > 0) //{ // NumBasket.Items.Remove(NumBasket.SelectedItem); //} if (isSysSet) return; DeleteSelected delete = new DeleteSelected(DeleteSelectItem); Dispatcher.BeginInvoke(delete, NumBasket.Items[NumBasket.SelectedIndex]); isSysSet = false; } void DeleteSelectItem(Object item) { if (NumBasket.Items.Count > 0) { isSysSet = true; NumBasket.Items.Remove(item); isSysSet = false; } }
查看Microsoft文档http://technet.microsoft.com/zh-cn/library/cc190259(v=vs.95).aspx
,对其中的一些代码 Dispatcher.BeginInvoke(delete, NumBasket.Items[NumBasket.SelectedIndex]);的解释是 在与 Dispatcher 关联的线程上异步执行指定的委托。
从解决方案中剖析问题所在:
发现 bool isSysSet = false; 这个变量好像没什么用,可是删除又会报错。。。。╮(╯_╰)╭
为什么感觉这个变量没用呢?我是这样肤浅的分析:
在DeleteSelectItem()方法中
isSysSet = true;
NumBasket.Items.Remove(item);
isSysSet = false;
将变量isSysSet设置为true以后,删除改行后,又立即设置为false了,这个能起到什么作用?也就是说,我想的是 选中某行就触发此事件,而且只有这一个线程。。嗯,现在问题分析出来了
是因为 NumBasket.Items.Remove(item); 这行代码执行时,它也会调用 NumBasket_SelectionChanged()这个事件,所以现在 变量isSysSet 的作用就体现出来了。