我想要实现一个场景,要求我知道用户是选择一个项目还是通过单击一个空白区域取消选择所有项目。基本上,我需要保持选择的第一个项目(始终存在)。应该可以选择不同的项目,但是一旦用户点击空白区域并且正常选择将被删除,它应该跳回到第一个(默认)项目。
我尝试使用列表视图控件的选择更改事件,但是这些事件是按照一个不太有用的顺序触发的:首先当前选择的项目丢失了选择。然后会有一个单独的事件来指示选择了一个新项目。
问题是:当第一次触发事件ItemSelectionChanged以表示不再选择先前选择的项目时,是否可以知道该项目是否被取消选择,因为正在选择另一个项目或因为什么都没有被选中?
答案 0 :(得分:1)
尝试此操作以查看它是否可以解决您的问题。我们删除事件回调以防止再次调用事件,应用我们的逻辑,并重新分配回调。
private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
{
listView1.ItemSelectionChanged -= listView1_ItemSelectionChanged;
if (!e.IsSelected)
{
listView1.Items[0].Selected = true;
listView1.Items[0].Focused = true;
}
else
{
listView1.Items[0].Selected = false;
listView1.Items[e.ItemIndex].Selected = true;
}
listView1.ItemSelectionChanged += listView1_ItemSelectionChanged;
}
答案 1 :(得分:1)
感谢您的回答。
我完全解决了它:在选择更改事件时,我启用了一个短计时器,当勾选时,检查ListView中是否有所选项目,如果没有,则选择第一个。并且它无论如何都会自行禁用。似乎它适合我,所以我停在那里。
答案 2 :(得分:0)
这将记住之前的选择并保留它。 (我的项目需要它,并在这里得到一些帮助)。
private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
{
int temp = 0;
listView1.ItemSelectionChanged -= listView1_ItemSelectionChanged;
if (!e.IsSelected)
{
temp = e.ItemIndex;
listView1.Items[temp].Selected = true;
listView1.Items[temp].Focused = true;
}
else
{
for (int y = listView1.Items.Count - 1; y >= 0; y--)
{
listView1.Items[y].Selected = false;
}
listView1.Items[e.ItemIndex].Selected = true;
}
listView1.ItemSelectionChanged += listView1_ItemSelectionChanged;
}