gpt4 book ai didi

c# - 阻止用户选择但允许以编程方式选择

转载 作者:太空宇宙 更新时间:2023-11-03 13:51:26 25 4
gpt4 key购买 nike

我的 Windows 应用程序中有一个 ListView 控件,其中填充了一些项目集。我将通过将 ListViewItem.Selected 属性设置为 true 以编程方式选择项目。但我想阻止用户在 ListView 中选择一个项目。即,它应该始终以编程方式选择。我可以通过禁用控件来阻止用户选择,但禁用控件也会禁用滚动条,这是不正确的。

我什至创建了自定义 ListView 控件并使用 WndProc check link 实现了 ItemSelectionChanging 事件处理程序| ,使用它我可以取消事件,如下所示,

private void lstLiveTables_ItemSelectionChanging(object sender, ListViewExItemSelectionChangingEventArgs e)
{
e.Cancel = true;
}

但同样,这将取消事件,即使对于以编程方式选择的项目也是如此。我的问题是,无论如何要确定选择是手动(由用户)还是在 SelectedIndexChanged 中以编程方式或使用 WndProc 消息进行的。

注意:如果需要,我会上传CustomListView控件的代码。

更新 1

谢谢埃马特尔。这是个好主意。甚至我也试图通过仅在选择项目之前订阅事件并在选择后立即将其删除来实现相同的目的。通过这种方式,选择后事件将立即触发并继续。这工作正常。

this.lstTables.SelectedIndexChanged += new System.EventHandler(this.lstTables_SelectedIndexChanged);
item.Selected = true;
this.lstTables.SelectedIndexChanged -= new System.EventHandler(this.lstTables_SelectedIndexChanged);

但是我又遇到了一个问题,如果用户手动选择一个项目,则什么也不会发生(不会触发任何事件),但该项目将被突出显示。突出显示项目后,如果我尝试以编程方式选择相同的项目,则不会发生任何事情,即 SelectedIndexChanged 事件不会针对该项目触发,因为它已经突出显示。

注意:即使我遵循您建议的 Flag 方法,行为也相同。

更新 2

我可以使用自己的方法来解决这个问题,而不是像 emartel 的建议那样通过事件来处理。但我的问题是,根据我的更新 1,当项目突出显示但实际上未被选中时,是否会触发 SelectedIndexChanged 事件?

最佳答案

public FrmTest()
{
list.ItemSelectionChanged += list_ItemSelectionChanged;
}

private bool changing;

private void list_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
{
if (changing)
return;

if (e.Item == nonSelectableListItem)
{
changing = true;
nonSelectableListItem.Selected = false;
changing = false;
}
}

示例:

enter image description here

关于c# - 阻止用户选择但允许以编程方式选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13583964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com