Windows应用程序窗体:在清除选定节点并在添加新项后重新填充树视图后使其保持展开状态C#

Windows应用程序窗体:在清除选定节点并在添加新项后重新填充树视图后使其保持展开状态C#,c#,windows,treeview,windows-applications,C#,Windows,Treeview,Windows Applications,我有一个应用程序,允许用户将新项目添加到TreeView控件中。选择项目时,父节点将显示其子节点,但当新项目(单击按钮)添加到Treeview控件时,父节点将崩溃。我希望它保持扩展状态,直到用户再次与它交互 //List<> collection is initialized //Public class property is created to set it's member variables to the control values that the user ente

我有一个应用程序,允许用户将新项目添加到TreeView控件中。选择项目时,父节点将显示其子节点,但当新项目(单击按钮)添加到Treeview控件时,父节点将崩溃。我希望它保持扩展状态,直到用户再次与它交互

//List<> collection is initialized 
//Public class property is created to set it's member variables to the control values that the user enters 

private void addButton_Click(object sender, EventArgs e)
{
  if (ComboBoxOne.SelectedIndex != 0)
      { 
         //Method that adds new item to a List<> Collection
         AddToList(); 
         //Method that goes through the List<> Collection, modifies the display of the item and adds it to the TreeView control
         AddToTreeView();
      }
}

//How I am adding the List<> objects to the treeview control
private void TravelTreeView()
{
   TreeView1.Nodes.Clear();
   //Items is the class I created and ObjectList is the List<>
   foreach (Items obj in ObjectList)
   {
      TreeNode node = new TreeNode();

       node.Text = obj.Name;
       //Imagelist has 7 images
       node.SelectedImageIndex = 0;
       node.ImageIndex = obj.NameImage;
       node.Nodes.Add(obj.AgeImage, "Age: " + obj.Age, 5);
       node.Nodes.Add(obj.ZodiacImage, "Zodiac: " + obj.Zodiac, 6);
       node.Nodes.Add(obj.JobImage, "Job: " + obj.Job, 7);

       TreeView1.Nodes.Add(node);
   }

}
//列表集合已初始化
//创建公共类属性以将其成员变量设置为用户输入的控件值
私有void addButton\u单击(对象发送者,事件参数e)
{
如果(ComboBoxOne.SelectedIndex!=0)
{ 
//方法将新项添加到列表集合
AddToList();
//方法,该方法遍历列表集合,修改项的显示并将其添加到TreeView控件
AddToTreeView();
}
}
//如何将列表对象添加到treeview控件
私有void TravelTreeView()
{
TreeView1.Nodes.Clear();
//Items是我创建的类,ObjectList是列表
foreach(对象列表中的项目对象)
{
TreeNode=新的TreeNode();
node.Text=obj.Name;
//Imagelist有7个图像
node.SelectedImageIndex=0;
node.ImageIndex=obj.NameImage;
node.Nodes.Add(obj.AgeImage,“年龄:”+obj.Age,5);
node.Nodes.Add(obj.Zodiac图像,“十二生肖:”+obj.Zodiac,6);
node.Nodes.Add(obj.JobImage,“作业:”+obj.Job,7);
TreeView1.Nodes.Add(节点);
}
}

我看到树视图被清除,然后用节点列表填充。如注释中所述,您可以检查IsExpanded属性,然后决定在TreeNode上调用Expand

另一种方法:当您添加许多新的树节点时,我假设这些节点没有以前的状态来检查IsExpanded,在这种情况下,您可以尝试以下操作,新节点是在expanded状态下添加的。注意Beginupdate/EndUpdate调用

    private void TravelTreeView()
    {
        // better to do this to avoid too many repaints
        TreeView1.BeginUpdate();

        TreeView1.Nodes.Clear();
        //Items is the class I created and ObjectList is the List<>
        foreach (Items obj in ObjectList)
        {
           TreeNode node = new TreeNode();

           node.Text = obj.Name;
           //Imagelist has 7 images
           node.SelectedImageIndex = 0;
           node.ImageIndex = obj.NameImage;
           node.Nodes.Add(obj.AgeImage, "Age: " + obj.Age, 5);
           node.Nodes.Add(obj.ZodiacImage, "Zodiac: " + obj.Zodiac, 6);
           node.Nodes.Add(obj.JobImage, "Job: " + obj.Job, 7);

           // add an expanded Node
           node.Expand();

           TreeView1.Nodes.Add(node);
       }
       // we are done with the updates to TreeView
       TreeView1.EndUpdate();
    }
private void TravelTreeView()
{
//最好这样做,以避免太多的重新绘制
TreeView1.BeginUpdate();
TreeView1.Nodes.Clear();
//Items是我创建的类,ObjectList是列表
foreach(对象列表中的项目对象)
{
TreeNode=新的TreeNode();
node.Text=obj.Name;
//Imagelist有7个图像
node.SelectedImageIndex=0;
node.ImageIndex=obj.NameImage;
node.Nodes.Add(obj.AgeImage,“年龄:”+obj.Age,5);
node.Nodes.Add(obj.Zodiac图像,“十二生肖:”+obj.Zodiac,6);
node.Nodes.Add(obj.JobImage,“作业:”+obj.Job,7);
//添加扩展节点
node.Expand();
TreeView1.Nodes.Add(节点);
}
//我们已经完成了对TreeView的更新
TreeView1.EndUpdate();
}

WinForms会保留控件的状态。这里的问题似乎是这样一个事实:您先清理项目,然后迭代对象,然后重新加载TreeView。在这种情况下,项目将被折叠,这是默认设置

我建议采用以下方法

private void TravelTreeView()
    {
        //Items is the class I created and ObjectList is the List<>
        foreach (Items obj in ObjectList)
        {
            //Check to see if the item already exists
            if (!TreeView1.Nodes.ContainsKey(obj.Name))
            {
                var node = new TreeNode();
                node.Text = obj.Name;
                //Imagelist has 7 images
                node.SelectedImageIndex = 0;
                node.ImageIndex = obj.NameImage;
                node.Nodes.Add(obj.AgeImage, "Age: " + obj.Age, 5);
                node.Nodes.Add(obj.ZodiacImage, "Zodiac: " + obj.Zodiac, 6);
                node.Nodes.Add(obj.JobImage, "Job: " + obj.Job, 7);

                TreeView1.Nodes.Add(node);
            }
        }
    }
private void TravelTreeView()
{
//Items是我创建的类,ObjectList是列表
foreach(对象列表中的项目对象)
{
//检查项目是否已存在
如果(!TreeView1.Nodes.ContainsKey(obj.Name))
{
var node=new TreeNode();
node.Text=obj.Name;
//Imagelist有7个图像
node.SelectedImageIndex=0;
node.ImageIndex=obj.NameImage;
node.Nodes.Add(obj.AgeImage,“年龄:”+obj.Age,5);
node.Nodes.Add(obj.Zodiac图像,“十二生肖:”+obj.Zodiac,6);
node.Nodes.Add(obj.JobImage,“作业:”+obj.Job,7);
TreeView1.Nodes.Add(节点);
}
}
}

有关TreeNodeCollection方法的信息

您是否确保在要添加的
TreeNode
上调用
Expand()
方法?您还可以使用TreeNode的
IsExpanded
属性检查它是否展开或折叠,然后执行相应的操作。该项应该折叠,直到用户与其交互,您的代码在将其添加到TreeView时将其展开,我不希望它这样做。@初学者我明白了。但是,您最初的问题“…但是当一个新项目(单击按钮)添加到Treeview控件时,它会崩溃。我希望它保持扩展状态,直到用户再次与它交互。”否则。。。保持崩溃应该通过不做任何特别的事情来实现。显然,当用户交互时,它会随着用户的扩展而扩展。也许,我不能理解你的问题。我认为你不理解这个问题,所以我要重新措辞,为给你带来的不便道歉。当新项目添加到TreeView时,它们看起来是折叠的(这是我想要它做的),但是假设用户决定打开第一个节点,然后决定向TreeView添加一个新节点。每当一个新项目被添加到树视图中时,它就会关闭任何展开的节点。我不想让它那样做。我希望这更有意义。@初学者代码器WinForms是一个状态完整的应用程序,因此无论添加或删除节点,被扩展或折叠的节点都将保持不变。但是,问题可能是因为您似乎正在清除并重新添加所有节点(
TreeView1.nodes.Clear();
),在这种情况下,
TreeView
将进入初始状态。您可以避免清除它,而是检查
TreeView1.Contains(TreeNode节点)
以查看要添加的节点是否已经存在,然后继续添加新节点。因此,研究Treeview.Contains()?输入新项目时,展开的节点保持打开状态,但现在有重复项。怎么