C# WinForms的 TreeView自动排序会导致我的应用程序崩溃

编程语言 2026-07-09

我刚接触C#,用TreeView做了一个WinForms应用。

我已经通过以下方式开启排序:

private void Form1_Load(object sender, EventArgs e)
{
    TreeView1.Sorted = true;   // enabled auto sort here
}

现在创建新节点时,TreeView会自动排序。

我的问题出现在让我用户通过我创建的上下文菜单项来重命名节点时。TreeView不会自动重新排序。

在我的上下文菜单项的事件处理程序中,我添加了 TreeViewDecks.Sort();

private void renameToolStripMenuItem_Click(object sender, EventArgs e)
{
    if (TreeView1.SelectedNode != null)
    {
        TreeView1.SelectedNode.BeginEdit();

        TreeView1.Sort();    // tried to call sort here stopped the edit
    }
}

但这会让我无法实际编辑标签,它只是对树进行了排序。我把它移除,并尝试在方法末尾通过添加 TreeViewDecks.Sort(); 来修改事件处理程序 TreeView1_AfterLabelEdit(...)

private void treeView1_AfterLabelEdit(object sender,
         System.Windows.Forms.NodeLabelEditEventArgs e)
{
   if (e.Label != null)
   {
       if (e.Label.Length > 0)
       {
           if (e.Label.IndexOfAny(new char[]{'@', '.', ',', '!'}) == -1)
           {
               // Stop editing without canceling the label change.
               e.Node.EndEdit(false);
           }
           else
           {
               /* Cancel the label edit action, inform the user, and
                  place the node in edit mode again. */
               e.CancelEdit = true;
               MessageBox.Show("Invalid tree node label.\n" +
                      "The invalid characters are: '@','.', ',', '!'",
                      "Node Label Edit");
               e.Node.BeginEdit();
           }
       }
       else
       {
            /* Cancel the label edit action, inform the user, and
               place the node in edit mode again. */
            e.CancelEdit = true;
            MessageBox.Show("Invalid tree node label.\nThe label cannot be blank",
               "Node Label Edit");
            e.Node.BeginEdit();
        }
    }

   TreeView1.Sorted = true;    // tried to call sort here crashed app
}

但这会导致我的应用崩溃。

MSDN TreeView.Sorted 属性指出:

将Sorted设置为true时,TreeNode对象会按Text属性的字母顺序排序。当向排序的TreeView添加大量项时,应始终使用BeginUpdate和 EndUpdate以维持性能。当对现有节点的文本进行修改时,必须调用Sort以重新排序。

我正在尝试按最后一句话的要求去做,但它没有说明在何时何地调用 TreeView1.Sort();。我已经尝试在我的上下文菜单事件处理程序中这么做,也尝试在 AfterLabelEdit 处理程序中这么做。

解决方案

正是Dr Null指点的办法,解决了我的崩溃,并在重命名标签后对树进行了排序:

AfterLabelEdit 事件中,等编辑成功完成后再延迟调用 .Sort() 方法。BeginInvoke(new Action(() => TreeView1.Sort()));

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章