ListView FocusedItem变为NULL

时间:2008-11-10 03:15:22

标签: c# listview selection

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

我们可以暂时解决此问题的唯一方法是清除并重新填充表单。缺点是我们丢失了突出显示的项目。还有另一种解决方法。也许我们不清楚ListView是如何工作的?

有什么想法吗?

5 个答案:

答案 0 :(得分:2)

OnSelectedIndexHandler

中添加以下条件
if(listViewObject.SelectedItems!=null&& listViewObject.SelectedItems.Count>0)
{
   //....your code here
}

答案 1 :(得分:1)

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

答案 2 :(得分:0)

我已经运行了一个测试程序,并且没有看到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)检查吗?

答案 3 :(得分:0)

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

  1. SelectedIndexChanged事件,其中焦点项,所选项和所选索引变为空。这就是造成上述问题的原因。
  2. ItemActivate事件可以在没有任何故障的情况下使用,其中焦点项目,所选项目或选定的索引在第二个或任何其他时间不为空。
  3. 在创建包含详细信息的列表视图时,默认情况下会触发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 :(得分:0)

您可以使用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();