【问题标题】:Why does listview fire event indicating that checked item is unchecked after adding为什么listview会触发事件,表明添加后未选中已选中的项目
【发布时间】:2011-11-22 07:46:47
【问题描述】:

我正在通过以下代码将项目添加到列表视图(c# winforms 应用程序):

var IT = new ListViewItem(Term);
IT.Checked = true;
MyListView.Items.Add(IT);

但是,在添加项目后,我立即收到一个表明该项目未选中的事件(e.Item.Checked 为假)。

然后我收到一个表明它已被检查的后续事件(e.Item.Checked 为真)。

为什么我会收到第一个事件?当我将项目添加到列表时,checked 属性是否由于某种原因被设置为 false?考虑到我在将检查状态添加到我的事件之前将其设置为 true,这似乎很奇怪。

非常感谢任何帮助。提前致谢。

【问题讨论】:

  • 您是如何注册您的活动的?
  • 为了帮助您,我们需要查看这些事件处理程序、它们包含的内容以及您如何将它们绑定到列表视图。
  • 通过将事件处理程序与 Visual Studio 中的“ItemChecked”事件相关联。
  • 无复制。什么操作系统?

标签: c# .net winforms listview


【解决方案1】:

似乎当每个 ListViewItem 的 CheckBox 添加到 ListView 时,它最初设置为未选中,这会触发 ItemChecked 事件。

在您的情况下,CheckBox 然后设置为选中以匹配再次触发事件的IT.Checked = true;

这似乎是设计使然,我认为没有办法阻止这些事件在加载时触发。

一种解决方法(虽然有点小技巧)是检查 ListView 的 FocusedItem 属性,因为在加载 ListView 并在之后保留对 ListItem 的引用之前,该属性为 null。

void listView1_ItemChecked(object sender, ItemCheckedEventArgs e)
{
    if (listView1.FocusedItem != null)
    {
        //Do something
    }
}

希望这会有所帮助。

【讨论】:

  • 非常感谢。你说得对。查看调用堆栈,我可以看到,checked 属性确实被设置回 false,然后在我添加项目后再次设置为 true。实际上,我有点惊讶它再次设置为 true,但是,这似乎是行为。
【解决方案2】:

我遇到了同样的困境,并且比 jdavies 的答案在本地解决了一些问题,方法是简单地过滤掉初始的“不是由用户引起的未检查状态”,如下所示

void listView_ItemChecked(object sender, ItemCheckedEventArgs e)
{
    if (!e.item.Checked && !e.item.Focused)
        return; // ignore this event
    //
    // do something
}

【讨论】:

    【解决方案3】:

    另一种解决方法:

    MyListView.CheckBoxes = false;
    MyListView.Items.Add(IT);
    MyListView.CheckBoxes = true;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-24
      • 2017-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多