我有一個TreeView控件。假設我有5個節點。在選擇一個節點時,我使用SelectedNode下的所有目錄填充一個ListView。然後,我單擊一個按鈕,它將修改ListView項目。多次觸發TreeView AfterSelect事件
因此,當我再次在TreeView中選擇節點(與之前選擇的節點相同)時,AfterSelect事件不會觸發。正因爲如此,我的ListView沒有得到更新。
任何想法傢伙/女孩?
我有一個TreeView控件。假設我有5個節點。在選擇一個節點時,我使用SelectedNode下的所有目錄填充一個ListView。然後,我單擊一個按鈕,它將修改ListView項目。多次觸發TreeView AfterSelect事件
因此,當我再次在TreeView中選擇節點(與之前選擇的節點相同)時,AfterSelect事件不會觸發。正因爲如此,我的ListView沒有得到更新。
任何想法傢伙/女孩?
這是不可能的。AfterSelect
事件將不會再次發生,因爲所選的節點是已選擇。 選擇不會改變,所以不會引發事件。
正如Hans在對原始問題的評論中指出的那樣,很可能是糟糕的UI設計,希望用戶意識到再次點擊已經選擇的節點會產生某種效果。更好的解決方案是將「刷新」功能添加到您的應用程序。這通常映射到F5密鑰,和/或Ctrl + R鍵盤快捷鍵。
如果當一個節點是重新選擇絕對必須觸發一些動作,則需要在比AfterSelect
事件較低的水平來處理它。這意味着要確定用戶手動點擊了哪個節點。爲此,請處理MouseDown
event,並使用HitTest
method確定用戶單擊位置處的節點。這並不美觀,我也不推薦它,但它會完成工作。
private void myTreeView_MouseDown(object sender, MouseEventArgs e)
{
TreeViewHitTestInfo info = myTreeView.HitTest(e.X, e.Y);
// Ensure that the user actually clicked on a node (there are lots of areas
// over which they could potentially click that do not contain a node)
if ((info.Node != null) && (info.Node == myTreeView.SelectedNode))
{
// The user clicked on the currently-selected node,
// so refresh the TreeView
// . . .
}
}
感謝您的建議...將嘗試此... – Dev 2011-04-27 06:17:48
謝謝,此代碼對我有用。你介意給同樣的情況代碼,但當用戶通過用TAB鍵UI導航? – 2011-11-17 13:38:50
它沒有發射,因爲該項目已被選中。改爲處理MouseDown
或PreviewMouseDown
。
我知道。沒有任何其他方式,我只能在AfterSelect事件中這樣做? – Dev 2011-04-25 12:11:51
,您可以選擇事件發生後用鼠標點擊事件,而不是
子treeView1_NodeMouseClick(BYVAL發件人爲對象,BYVALË作爲TreeNodeMouseClickEventArgs)處理TreeView1.NodeMouseClick
' textBox1.Text = e.Node.Text
If Not e.Node.Tag Is Nothing Then
Dim frm As Form = DirectCast(e.Node.Tag, Form)
frm.ShowDialog()
''frm.Dispose()
End If
End Sub
期待用戶發現點擊一個已經選定的節點會產生一個效果是一廂情願的想法。添加一個刷新按鈕並實現F5按鍵。 – 2011-04-25 13:06:24