【问题标题】:How to display SQL data (4 levelsdeep) in a tree view with C#如何使用 C# 在树视图中显示 SQL 数据(4 级深度)
【发布时间】:2021-10-07 13:41:58
【问题描述】:

我有一个名为 Notebook.Notes 的 SQL 表,其中包含以下字段(所有字符串):

TAB CONTACT SUBJECT NOTES
ERP Project Doe, Mary Progress Report 09/09/2021 9:00 AM - No problems.
Engr Project Doe, Randy Progress Report 09/10/2021 10:00 AM - Big problems.
Engr Project Doe, Randy Problems 09/10/2021 1:00 PM - Needs 2 engrs added.
ERP Project Doe, Mary Progress Report 09/16/2021 9:00 AM - No poroblems.
Staff Mtg. IT Staff Monthly Meeting 09/29/2021 11:00 AM - Issues w/Server

数据是这样显示的(3行) 工程师项目、ERP 项目、人员配备 Mtg。当您单击 Engr Project 时,您会看到 Doe、Randy 等。相反,我会看到 5 行显示 ERP Project、Engr Project、Engr Project、ERP Project、Staff Mtg。我究竟做错了什么?这是代码。

 SqlCommand cm = new SqlCommand("SELECT * FROM Notebook.Notes ORDER BY Tab;", cn);
        try
        {
            treeView1.Nodes.Clear();
            SqlDataReader dr = cm.ExecuteReader();
            while (dr.Read())
            {
                TreeNode node = new TreeNode(dr["Tab"].ToString());
                node.Nodes.Add(dr["Contact"].ToString());
                node.Nodes.Add(dr["Subject"].ToString());
                treeView1.Nodes.Add(node);
            }
        }
        catch (Exception ex)
        {
           // MessageBox.Show(Message ex )
        }


  
      

【问题讨论】:

  • 同时指定预期结果。与给定数据的格式相同。)

标签: c# sql


【解决方案1】:

您需要跟踪每个级别的节点,并以嵌套方式添加它们。像这样的:

treeView1.Nodes.Clear();

const string query = @"
SELECT *
FROM Notebook.Notes
ORDER BY Tab, Contact, Subject;
";
using (var cn = new SqlConnection(YourConnectionString))
using (var cm = new SqlCommand(query, cn))
{
    cn.Open();
    TreeNode tab = null;
    TreeNode contact = null;
    TreeNode subject = null;
    using (var dr = cm.ExecuteReader())
    {
        while (dr.Read())
        {
            if(tab?.Text != (string)dr["Tab"])
            {
                tab = new TreeNode((string)dr["Tab"]);
                treeView1.Nodes.Add(tab);
            }
            if(contact?.Text != (string)dr["Contact"])
            {
                contact = new TreeNode((string)dr["Contact"]);
                tab.Nodes.Add(contact);
            }
            if(subject?.Text != (string)dr["Subject"])
            {
                subject = new TreeNode((string)dr["Subject"]);
                contact.Nodes.Add(subject);
            }
            subject.Nodes.Add(new TreeNode((string)dr["Notes"]);
        }
    }
}

注意事项:

  • 要使此代码正常工作,您需要在 SQL 中添加一个ORDER BY。如果没有,您将需要另一种方法来跟踪节点,例如 Dictionary
  • 注意使用new SqlConnection,不要缓存它
  • 注意using 块的使用
  • 您可以稍微缩短代码
if(tab?.Text != (string)dr["Tab"])
    treeView1.Nodes.Add(tab = new TreeNode((string)dr["Tab"]));
  • 但是,这种语法可能会让某些人感到困惑

【讨论】:

  • 您提供的解决方案运行良好。我想将显示顺序更改为 Tab、Subject、Contact、Notes。这是我所做的:1。将 SQL ORDER BY 更改为 Tab、Subject、Contact、Notes.2。如果语句修改了必要的字段,请翻转联系人和主题。3。在最后一个 if 语句后添加一行到 contact.Nodes.Add(new TreeNode((string)dr["DateTime"].ToString() + " " + (string)dr["Note"].ToString())) ;.一切正常,除非选项卡具有具有相同联系人的不同主题。显示的是选项卡、主题、与两个主题相关的所有注释然后只显示主题?
  • 除了交换ifs 的顺序之外,您还需要将contact.Nodes.Add(subject); 更改为tab.Nodes.Add(subject);tab.Nodes.Add(contact); 更改为subject.Nodes.Add(contact);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
  • 2016-08-04
  • 1970-01-01
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多