5

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

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

有任何想法吗?

4

5 回答 5

3

将以下条件放在 中OnSelectedIndexHandler

if(listViewObject.SelectedItems!=null&& listViewObject.SelectedItems.Count>0)
{
   //....your code here
}
于 2010-12-28T19:27:41.443 回答
1

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

于 2008-11-10T10:33:49.863 回答
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)检查对你的情况有用吗?

于 2008-11-10T06:11:36.883 回答
0

我在使用 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_SelectedIndexChangedTaskslistView_ItemActivate.

这应该可以解决问题。

于 2010-03-18T22:16:17.123 回答
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();
于 2017-01-04T21:10:23.737 回答