首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# TreeView 單擊節點不觸發 AfterSelect:變數名稱不一致導致事件綁定錯誤

     編輯:程式設計綜合問答

問題代碼片段


private void LoadList() {
    if (trvGroup.Nodes.Count == 0) return;
    if (trvGroup.SelectedNode.Index >= 0) { ... } // 使用 trvGroup
}
private void trvGroup_AfterSelect(object sender, TreeViewEventArgs e) {
    LoadList();
}
private void trvGroup_MouseDown(object sender, MouseEventArgs e) {
    if ((sender as TreeView) != null) {
        trvGroup.SelectedNode = trvGroup.GetNodeAt(e.X, e.Y); // 又用 trvGroup
    }
}

根因分析

程式碼中混用 trvGroup (欄位名) 與 treeview (可能為設計器產生的另一個 TreeView 控件實例)。若在設計器屬性視窗將 AfterSelect 事件綁定給了 treeview,但代碼邏輯操作的是 trvGroup,則會出現「點擊無反應、永遠顯示第一個節點資料」現象。

排查步驟

  1. 檢查設計器生成的 InitializeComponent(),確認 this.trvGroup.AfterSelect += ... 只出現一次,且目標控件名稱一致。
  2. 在 trvGroup_AfterSelect 開頭加 Debug.WriteLine(sender.GetHashCode()),點擊不同 TreeView 觀察 HashCode 是否固定。
  3. 若專案有多個 TreeView,建議統一命名規範 (如 tvUserGroup、tvDeptTree) 並移除未使用的控件。

修正範本


// 僅保留一個 TreeView 欄位
private TreeView tvGroup; // 重新命名

// 事件註冊 (在 InitializeComponent 或建構子)
this.tvGroup.AfterSelect += TvGroup_AfterSelect;
this.tvGroup.MouseDown += TvGroup_MouseDown;

private void TvGroup_AfterSelect(object sender, TreeViewEventArgs e) {
    LoadList(e.Node); // 直接用 e.Node,避免 SelectedNode 可能為 null
}

private void TvGroup_MouseDown(object sender, MouseEventArgs e) {
    // 通常不需手動設 SelectedNode,AfterSelect 會自動觸發
    // 若需右鍵選中再顯示選單,改用 ContextMenuStrip
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved