【问题标题】:Assign object to treeview child node in c# to identify parent在c#中将对象分配给treeview子节点以识别父节点
【发布时间】:2017-03-11 13:05:33
【问题描述】:

您好,我正在尝试将子节点附加到父节点,具体取决于它们的字符串是否匹配。

我遇到了一些问题,因为我不确定如何仅通过名字来识别父母。例如,如果 "string a" == "string a" 那么我想将子节点 LoanName 添加到字符串与父名称匹配的父 id。

如果我这样做,这会起作用:

tvTodoList.Nodes[0].Nodes.Add(activityResult.ActivityName);

但显然这会将子节点附加到树视图中的第一个父节点。如何让它与变量loanresult.LoanName 的名称相匹配?

下面是我的 FillTodoList 方法的代码

private void FillTodoList()
{
    var nol = NetworkOpsLayer.NetworkOpsLayer.CreateForDirectMongoConnection("mongodb://localhost", "test", "loans");
    //demoSave(nol);

    var loanList = nol.GetDocsWhichMatchGivenDocString("{ \"isActive\" : 1 }");

    foreach (string s in loanList)
    {
        //System.Console.WriteLine(s);
        var loanResult = JsonConvert.DeserializeObject<RootObject>(s);

        tvTodoList.Nodes.Add("Loan Name: " + loanResult.LoanName);

        //Add children to each Loan

        var con = NetworkOpsLayer.NetworkOpsLayer.CreateForDirectMongoConnection("mongodb://localhost", "test", "activity");
        //demoSave(con);
        var activityList = con.GetDocsWhichMatchGivenDocString("{ \"isActive\" : 1 }");

        foreach (string st in activityList)
        {
            var activityResult = JsonConvert.DeserializeObject<Activity>(st);
            if (loanResult.LoanName == activityResult.ParentLoanName)
            {
                tvTodoList.Nodes[loanResult.LoanName].Nodes.Add(activityResult.ActivityName);
            }
        }
    }
}

【问题讨论】:

  • 不要发送随机标签或忽略重要标签。这与 node.js 或 WPF 无关。它确实与winforms有关。
  • 如果可以的话,使用节点的Name 属性来分配字符串标识符。否则使用Tag 属性添加附加信息。您可以使用其Name 或其Tag 来查找节点,如下所述:How to select a Node by Tag in Windows Forms TreeView
  • @RezaAghaei 你是对的。虽然这并没有完全解决我的问题,但它确实帮助我找到了答案。我会将其标记为答案,并在下面评论我为获得解决方案而采取的额外步骤。

标签: c# winforms treeview


【解决方案1】:

TreeNodeCollection.Find(string, boolean) 方法将对此有所帮助...

foreach (string st in activityList)
{
    var activityResult = JsonConvert.DeserializeObject<Activity>(st);
    if (loanResult.LoanName == activityResult.ParentLoanName)
    {
        TreeNode[] matches = tvTodoList.Nodes.Find("Loan Name: " + loanResult.LoanName, false);
        if (matches.Length > 0) matches[0].Nodes.Add(activityResult.ActivityName);
    }
}

【讨论】:

  • 使用Name 属性,您无需在节点集合中搜索自己。只需使用treeView1.Nodes.Find("something", true)
  • 经过进一步检查,我发现您是对的。名为“key”的参数有点误导,我以为它实际上是指一个键。
  • @BlakeThingstad 感谢您的回答。不幸的是,这不会将任何子节点添加到父节点。 matches[0].Nodes.Add(activityResult.ActivityName); 永远不会运行。我试图找出原因,因为字符串匹配得很好..
  • @A1raa 我刚刚意识到,当您将节点添加到 tvTodoList 时,您会将 loadnResult.LoanName 与“贷款名称:”连接起来。您需要将其用于 sea5rch tvTodoList.Nodes。我将编辑答案包括这个。
  • @BlakeThingstad 这是我的错。我有tvTodoList.Nodes.Add(loanResult.LoanName);,它在添加tvTodoList.Nodes.Add(loanResult.LoanName, loanResult.LoanName); 后给了我Text: "TestOne"Name: "",它给了我loanResult.LoanName 作为TextName,这就是我所追求的。然后我用你的代码来匹配Name,它是“”。我没有正确设置重载。
猜你喜欢
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
相关资源
最近更新 更多