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,則會出現「點擊無反應、永遠顯示第一個節點資料」現象。
InitializeComponent(),確認 this.trvGroup.AfterSelect += ... 只出現一次,且目標控件名稱一致。trvGroup_AfterSelect 開頭加 Debug.WriteLine(sender.GetHashCode()),點擊不同 TreeView 觀察 HashCode 是否固定。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
}