【问题标题】:ListView FocusedItem Becomes NULLListView FocusedItem 变为 NULL
【发布时间】:2010-09-21 13:50:36
【问题描述】:

程序运行时,有一系列的ListView表单。我们用项目(作为字符串)填充其中一个,并检查选择状态是否已更改。更改后,我们使用 FocusedItem.Text 获取所选项目的文本。第一次工作得很好,但是当进行另一个选择时,所选项目返回为空。

我们可以暂时解决此问题的唯一方法是清除并重新填充表单。缺点是我们丢失了突出显示的项目。必须有另一种方法来解决这个问题。也许我们不清楚 ListView 的真正工作原理是什么?

有什么想法吗?

【问题讨论】:

  • 我在VS2010中遇到了同样的问题。焦点为空,我无法让 SelectedIndices 或 SelectedItems 计数大于零。我在下面尝试了 mukunda 的解决方案,它开始工作了。然后我剖析并最终禁用了他的解决方案,它继续工作。现在我没有问题,实际上我没有更改任何代码。所以我猜这是某种奇怪的 VS 编译时错误。

标签: c# listview selection


【解决方案1】:

我运行了一个测试程序,没有看到 FocusedItem 可能为空的实例。

你能发布一些代码吗?

这是我选择项目“a”然后选择项目“b”然后单击空白区域后得到的结果:

ItemSelectionChanged
    Item         : ListViewItem: {a}
    IsSelected   : True
    SelectedItem : ListViewItem: {a}
    FocusedItem  : ListViewItem: {a}
SelectedIndexChanged
    SelectedItem : ListViewItem: {a}
    FocusedItem  : ListViewItem: {a}
ItemSelectionChanged
    Item         : ListViewItem: {a}
    IsSelected   : False
    SelectedItem : null
    FocusedItem  : ListViewItem: {a}
SelectedIndexChanged
    SelectedItem : null
    FocusedItem  : ListViewItem: {a}
ItemSelectionChanged
    Item         : ListViewItem: {b}
    IsSelected   : True
    SelectedItem : ListViewItem: {b}
    FocusedItem  : ListViewItem: {b}
SelectedIndexChanged
    SelectedItem : ListViewItem: {b}
    FocusedItem  : ListViewItem: {b}
ItemSelectionChanged
    Item         : ListViewItem: {b}
    IsSelected   : False
    SelectedItem : null
    FocusedItem  : ListViewItem: {b}
SelectedIndexChanged
    SelectedItem : null
    FocusedItem  : ListViewItem: {b}

注意到FocusedItem 永远不会为空。

你的情况也一样吗?

简单的if (listView.FocusedItem == null) 检查是否适合您的情况?

【讨论】:

    【解决方案2】:

    如果您在用户选择的项目之后,您应该使用SelectedItems 集合中的第一个项目。 FocusedItem 是当前具有键盘焦点的项目(因此显示虚线焦点矩形);如果控件没有焦点,项目也没有。

    【讨论】:

      【解决方案3】:

      我在使用 listview 时遇到了同样的问题。选择时触发的事件似乎存在一些问题。

      1. SelectedIndexChanged 焦点项目、选定项目和选定索引变为空的事件。这就是上述问题的原因。
      2. ItemActivate 事件可以交替使用,而不会出现任何故障,其中焦点项目、选定项目或选定索引在第二次或任何其他时间不为空。

      在创建带有详细信息的列表视图时,默认情况下会触发 SelectedIndexChanged 事件。因此,更改相应的 Designer 类和主类中的相关事件处理程序就可以完成这项工作。

      在设计器类中,查看订阅的事件。示例:

      this.TaskslistView.SelectedIndexChanged
            += new System.EventHandler(TaskslistView_SelectedIndexChanged);
      

      主类中存在相应的TaskslistView_SelectedIndexChanged 事件处理程序方法。将此事件替换为

      this.TaskslistView.ItemActivate
            += new System.EventHandler(this.TaskslistView_ItemActivate);
      

      并将相应的TaskslistView_SelectedIndexChanged 替换为TaskslistView_ItemActivate

      这应该可以解决问题。

      【讨论】:

        【解决方案4】:

        将以下条件放在OnSelectedIndexHandler 中:

        if(listViewObject.SelectedItems!=null&& listViewObject.SelectedItems.Count>0)
        {
           //....your code here
        }
        

        【讨论】:

          【解决方案5】:

          您可以使用 ListViewItemSelectionChangedEventHandler。

          ListView.ItemSelectionChanged += 
          new ListViewItemSelectionChangedEventHandler(ListView_ItemSelectionChanged);
          
          private void ListView_ItemSelectionChanged(Object sender, ListViewItemSelectionChangedEventArgs e)
          {
              var x = e.IsSelected;
          }
          

          ListView_ItemSelectionChanged 被调用两次。您可以使用

          忽略第一个
          if (e.IsSelected == true)
          

          编辑: 试试这个:

          ListView.Select();
          

          【讨论】:

            猜你喜欢
            • 2011-08-03
            • 2023-03-25
            • 2012-06-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-12-29
            相关资源
            最近更新 更多