Treeview主数据细节

雷波蒂亚

成员
已加入
2016年9月20日
留言内容
16
编程经验
Beginner
你好

我在Mysql中有4个表,如何在数据库中建立DataRelation并在Windows Aplicacion中显示如下图所示的数据。

谢谢

C#:
Select * from a1_locaismaq
Select * from a2_maquinas
Select * from a3_ponto_lub


图片14.jpg
imag.JPG
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,553
地点
悉尼,澳大利亚
编程经验
10+
这是一个示例,将从三个相关的数据库表中填充WinForms TreeView中的三个级别。您可以将原理扩展到任意多的层。
private readonly DataSet data = new DataSet();

private DataTable parentTable;
private DataTable childTable;
private DataTable grandChildTable;

private DataRelation parentChildRelation;
private DataRelation childGrandChildRelation;

private void Form1_Load(object sender, EventArgs e)
{
    var connection = new SqlConnection("connection string here");

    var parentAdapter = new SqlDataAdapter("SELECT ParentId, ParentName FROM Parent", connection);
    var childAdapter = new SqlDataAdapter("SELECT ParentId, ChildId, ChildName FROM Child", connection);
    var grandChildAdapter = new SqlDataAdapter("SELECT ChildId, GrandChildId, GrandChildName FROM GrandChild", connection);

    connection.Open();
    parentAdapter.Fill(data, "Parent");
    childAdapter.Fill(data, "Child");
    grandChildAdapter.Fill(data, "GrandChild");
    connection.Close();

    parentTable = data.Tables["Parent"];
    childTable = data.Tables["Child"];
    grandChildTable = data.Tables["GrandChild"];

    parentChildRelation = data.Relations.Add(parentTable.Columns["ParentId"], childTable.Columns["ChildId"]);
    childGrandChildRelation = data.Relations.Add(childTable.Columns["ChildId"], grandChildTable.Columns["GrandChild"]);

    this.treeView1.Nodes.AddRange(GetParentNodes()); 
}

private TreeNode[] GetParentNodes()
{
    var parentNodes = new List<TreeNode>();

    foreach (var parentRow in parentTable.AsEnumerable())
    {
        var parentNode = new TreeNode((string) parentRow["ParentName"]);

        parentNode.Nodes.AddRange(GetChildNodes(parentRow));
        parentNodes.Add(parentNode);
    }

    return parentNodes.ToArray();
}

private TreeNode[] GetChildNodes(DataRow parentRow)
{
    var childNodes = new List<TreeNode>();

    foreach (var childRow in parentRow.GetChildRows(parentChildRelation))
    {
        var childNode = new TreeNode((string) childRow["ChildName"]);

        childNode.Nodes.AddRange(GetGrandChildNodes(childRow));
        childNodes.Add(childNode);
    }

    return childNodes.ToArray();
}

private TreeNode[] GetGrandChildNodes(DataRow childRow)
{
    var grandChildNodes = new List<TreeNode>();

    foreach (var grandChildRow in childRow.GetChildRows(childGrandChildRelation))
    {
        var grandChildNode = new TreeNode((string) grandChildRow["GrandChildName"]);

        grandChildNodes.Add(grandChildNode);
    }

    return grandChildNodes.ToArray();
}

请注意,我使用了SqlClient类型,但是与MySqlClient类型完全相同。
 

雷波蒂亚

成员
已加入
2016年9月20日
留言内容
16
编程经验
Beginner
谢谢,您是asp.net Webform的使用者吗?我得到错误在这里我没有"AddRange"
this.treeView1.Nodes.AddRange(GetParentNodes());
childNode.Nodes.AddRange(GetGrandChildNodes(childRow));
谢谢


C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using MySql.Data;
using MySql.Data.MySqlClient;
 
using System.Data;

public partial class Default3 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
private readonly DataSet data = new DataSet();

    private DataTable parentTable;
    private DataTable childTable;
    private DataTable grandChildTable;

    private DataRelation parentChildRelation;
    private DataRelation childGrandChildRelation;

    private void Form1_Load(object sender, EventArgs e)
    {
        var connection = new MySqlConnection("connection string here");

        var parentAdapter = new MySqlDataAdapter("SELECT ParentId, ParentName FROM Parent", connection);
        var childAdapter = new MySqlDataAdapter("SELECT ParentId, ChildId, ChildName FROM Child", connection);
        var grandChildAdapter = new MySqlDataAdapter("SELECT ChildId, GrandChildId, GrandChildName FROM GrandChild", connection);

        connection.Open();
        parentAdapter.Fill(data, "Parent");
        childAdapter.Fill(data, "Child");
        grandChildAdapter.Fill(data, "GrandChild");
        connection.Close();

        parentTable = data.Tables["Parent"];
        childTable = data.Tables["Child"];
        grandChildTable = data.Tables["GrandChild"];

        parentChildRelation = data.Relations.Add(parentTable.Columns["ParentId"], childTable.Columns["ChildId"]);
        childGrandChildRelation = data.Relations.Add(childTable.Columns["ChildId"], grandChildTable.Columns["GrandChild"]);

        this.TreeView1.Nodes.AddAt(GetParentNodes());
    }

    private TreeNode[] GetParentNodes()
    {
        var parentNodes = new List<TreeNode>();

        foreach (var parentRow in parentTable.AsEnumerable())
        {
            var parentNode = new TreeNode((string)parentRow["ParentName"]);

            parentNode.Nodes.AddRange(GetChildNodes(parentRow));
            parentNodes.Add(parentNode);
        }

        return parentNodes.ToArray();
    }

    private TreeNode[] GetChildNodes(DataRow parentRow)
    {
        var childNodes = new List<TreeNode>();

        foreach (var childRow in parentRow.GetChildRows(parentChildRelation))
        {
            var childNode = new TreeNode((string)childRow["ChildName"]);

            childNode.Nodes.AddRange(GetGrandChildNodes(childRow));
            childNodes.Add(childNode);
        }

        return childNodes.ToArray();
    }

    private TreeNode[] GetGrandChildNodes(DataRow childRow)
    {
        var grandChildNodes = new List<TreeNode>();

        foreach (var grandChildRow in childRow.GetChildRows(childGrandChildRelation))
        {
            var grandChildNode = new TreeNode((string)grandChildRow["GrandChildName"]);

            grandChildNodes.Add(grandChildNode);
        }

        return grandChildNodes.ToArray();
    }

}
 
Last edited:

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,553
地点
悉尼,澳大利亚
编程经验
10+
抱歉,我错过了此问题发布在哪个论坛。尽管原理仍然相同。您只需要查看通常如何在Web窗体TreeView中添加节点和子节点并进行相应的调整。
 

雷波蒂亚

成员
已加入
2016年9月20日
留言内容
16
编程经验
Beginner
感谢您的时间
当我选择节点时,我会尝试执行多用户Web应用吗?如果它是主节点,或者页面2是生成节点,我可以打开它吗?

受保护的void TreeView1_SelectedNodeChanged(对象发送者,EventArgs e)
{
this.TextBox1.Text = TreeView1.SelectedNode.Value.ToString();
this.TextBox2.Text ="You selected: "+ TreeView1.SelectedNode.Text;

}
 

雷波蒂亚

成员
已加入
2016年9月20日
留言内容
16
编程经验
Beginner
谢谢吗?我可以通过单个查询加入联接并创建Treeview吗?
FROM
选择
clienteninc,a1_locaismaq,
`a1_locaismaq`.`localmaq_inc`,
`a2_maquinas`.`maquinas_ninc`,
`a3_ponto_lub`.`maquinas_ninc`,
`a2_maquinas`.`localmaq_inc`,
..................................................................
`a2_maquinas`
内连接`a3_ponto_lub` ON(`a2_maquinas`.`maquinas_ninc` =`a3_ponto_lub`.maquinas_ninc`)
内连接`a1_locaismaq` ON(`a1_locaismaq`.`localmaq_inc` =`a2_maquinas`.`localmaq_inc`)
内部联接a4_materias`开启(a3_ponto_lub`.ponto_inc` = a4_materias.ponto_inc)
内部联接`clientes` ON(`a1_locaismaq`.`clienteninc` =`clientes..clienteninc`)
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,553
地点
悉尼,澳大利亚
编程经验
10+
首先,请仅将QUOTE标记用于引号。毫不奇怪,CODE标签用于代码。
谢谢吗?我可以通过单个查询加入联接并创建Treeview吗?
绝对是
var sql = @"SELECT p.ParentId, ParentName, ChildId, ChildName
            FROM Parent p INNER JOIN Child c ON p.ParentId = c.ParentId
            ORDER BY p.ParentId, ChildId";
var adapter = new SqlDataAdapter(sql, connectionString);
var table = new DataTable();

adapter.Fill(table);

int currentParentId = 0;

foreach (DataRow row in table.Rows)
{
    var parentId = (int) row["ParentId"];

    if (parentId != currentParentId)
    {
        // New parent.
        // ...

        currentParentId = parentId;
    }

    // ...
}
 

雷波蒂亚

成员
已加入
2016年9月20日
留言内容
16
编程经验
Beginner
树查询完成了,请您帮忙

字符串ConnString = ConfigurationManager.ConnectionStrings ["DBMANUTEN"].ConnectionString;


MySqlConnection conn =新的MySqlConnection(ConnString);

var sql = @"SELECT clientes.clienteninc,clientes.morada,clientes.clientenome,a1_locaismaq.local_obs,a1_locaismaq.local,a1_locaismaq.clienteninc,a1_locaismaq.localmaq_inc,a2_maquinas.maquinas_ninc,a2_maquinas.localmaq_inc,a2_maquinas.maq_nome,a3_ponto_lub.maquinas_ninc,a3_ponto_lub.ponto_inc,a3_ponto_lub .tag_codigo,a3_ponto_lub.serv_codig,a3_ponto_lub.ponto_designa,a3_ponto_lub.local,a3_ponto_lub.maq_nome,a3_ponto_lub.maq_ativa,a3_ponto_lub.maq_local来自客户端
内连接a1_locaismaq ON(clientes.clienteninc = a1_locaismaq.clienteninc)
内连接a2_maquinas ON(a1_locaismaq.localmaq_inc = a2_maquinas.localmaq_inc)
内连接a3_ponto_lub ON(a2_maquinas.maquinas_ninc = a3_ponto_lub.maquinas_ninc)";

var adapter = new MySqlDataAdapter(sql,ConnString);
var TrevCliente = new DataTable();

adapter.Fill(TrevCliente);
 

雷波蒂亚

成员
已加入
2016年9月20日
留言内容
16
编程经验
Beginner
谢谢
表a1_locaismaq,a2_maquinas和a3_ponto_lub的收益。

C#:
          foreach (DataRow row in TrevCliente.Rows)
            {
                var parentId = (int)row["clienteninc"];
            
                if (parentId != currentParentId)
                {
                    TreeNode node = new TreeNode();
                node.Text = row["morada"].ToString();
                node.Value = row["clienteninc"].ToString();

                    // New parent.
                    // ...

                    currentParentId = parentId;
                   TreeView1.Nodes.Add(node);
                }

                foreach (DataRow childRow in parentId.GetChildRows("SecondHierarchy"))
                {
                    TreeNode childNode = new TreeNode((string)childRow["ChildText"], Convert.ToString(childRow["ChildID"]));
                    masterNode.ChildNodes.Add(childNode);
                    childNode.Value = Convert.ToString(childRow["Child"]);
                }
                // ...
            }
 
由主持人最后编辑:

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,553
地点
悉尼,澳大利亚
编程经验
10+
前面我问过您不要在代码中使用QUOTE标记,而您又做了一次。这次我已为您修复了该问题,但是下次我将直接忽略该帖子。如果正确发布代码对您来说太麻烦了,那么阅读对我来说太麻烦了。

在三个级别中,我的上一个示例变为:
var sql = @"SELECT p.ParentId, ParentName, ChildId, ChildName
            FROM Parent p INNER JOIN Child c ON p.ParentId = c.ParentId
            ORDER BY p.ParentId, ChildId";
var adapter = new SqlDataAdapter(sql, connectionString);
var table = new DataTable();

adapter.Fill(table);

int currentParentId = 0;
int currentChildId = 0;

foreach (DataRow row in table.Rows)
{
    var parentId = (int) row["ParentId"];
    var childId = (int) row["ChildId"];

    if (childId != currentChildId)
    {
        // New child.
        // ...

        if (parentId != currentParentId)
        {
            // New parent.
            // ...

            currentParentId = parentId;
        }

        // ...

        currentChildId = childId;
    }

    // ...
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,553
地点
悉尼,澳大利亚
编程经验
10+
Hi 金西尼

如果我单击TreeView(../../ ..)的字段,我可以转到其他页面。
谢谢你

当然可以,但这与该主题无关,因此我不会在该主题中回答。如果您对新主题有疑问,则应以描述该主题的标题开始新主题。
 
最佳 底部