2012-11-27 234 views
2

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

即使我已创建一个自定义列表视图控件实现并采用的WndProc check link一个ItemSelectionChanging事件处理程序,使用它我可以取消事件,如下图所示,

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

但同样,这将取消该事件,甚至以编程方式选择的项目。我的问题是,无论如何确定选择是手动(由用户)还是以编程方式在SelectedIndexChanged或使用WndProc消息。

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

更新1

感谢emartel。这是一个很好的想法。即使我试图通过只在选择项目之前订阅事件并在选择后立即将其删除之后实现相同的目的。通过这种方式,选择后,事件将立即触发并继续。这工作正常。

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

但同样我有,如果用户手动选择一个项目,什么都不会发生(不将触发事件),但是单独的项目将被高亮显示的问题。一旦项目突出显示,并且如果我尝试以编程方式选择相同的项目,则不会发生任何事件,即SelectedIndexChanged事件没有被触发,因为它已被突出显示。

注意:即使我遵循您所建议的标记方法,也会出现相同的行为。

更新2

我可以有我自己的方法,而不是通过事件emartel的建议处理解决这个问题。但我的问题是,根据我的更新1,无论如何,当项目被突出显示但没有实际选择时触发SelectedIndexChanged事件?

+0

我想你正在看着这个错误的方式 - 总是触发和'取消'框的检查*除非*你在编程上做 - 例如'void itemChanging(object sender,ListViewExItemSelectionChangingEventArgs e){if(!programaticallyChanging)e.Cancel = true; }'。然后当编程方式改变'programaticallyChanging'设置为true时,然后设置'selected'标志,然后将'programaticallyChanging'设置为false – Charleh

+0

但emartel有一点 - 为什么要为事件打扰?事件的要点是在发生某些操作时处理事件...如果您在代码隐藏中控制项目的滴答声,为什么不直接跳过整个事件处理程序呢? – Charleh

+0

啊挂 - 我刚刚意识到我看了你的更新,然后同意emartels评论不会为你工作,然后我打了我自己的大脑一秒钟,并忽略了原来的想法,并用谎言代替它,然后张贴作为评论谎言。我原来的评论应该工作,第二个只是一个疯狂的时刻 – Charleh

回答

0

那么,一个简单的解决办法是保持一个标志说,你是编程方式更改的选择,并允许的情况下通过,并重置标志当你完成

编辑:如果您,只有你,可以改变选择,并且你以编程的方式做到这一点,所以你有控制在何时何地发生这种情况,为什么你甚至需要EventHandler?为什么不调用一个方法来做任何你想要发生的处理呢?

+0

请检查更新1 – Reuben

+0

其实我是通过事件,因为它实际上是从另一个事件触发。无论如何,你是对的,我可以有我自己的方法,可以从原始事件中调用。谢谢。 – Reuben

0

一个这样做的方法是保持所选项目的列表和刷新选择每次改变其他方式比你的代码。

还有一个ItemSelectionChanged事件会针对其选择状态已更改的每个项目单独引发。您可以将选择状态翻转回此事件。

你也可以看看Better ListView Express控件。它有一个只读模式,所以用户不能改变选择。它的设置非常简单:

listView.ReadOnly = true; 

full version还支持自定义的非选项。简单设置:

listView.Items[0].Selectable = false; 

使第一个不可选(由用户)。

当然,您仍然可以从代码中选择项目。

下图显示了在行动非可选项目(它们是由灰色标记):

enter image description here

1
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

相关问题