2016-09-02 10 views
0

У меня есть таблица с двумя столбцами, и я хочу, чтобы отобразить их иерархически в виде дерева с привязкой базы данных Oracle с использованием Windows Forms (.NET 4.0)C# - Создание TreeView из базы данных (Oracle) - WinForms

ORGID, PARENTID 
====================== 
1  -   
2  1   
3  1   
4  3   
..... 

Будучи ORGID родителем, а PARENTID - дочерним (который также может быть родителем).

Я попытался это:

public partial class OrgHierarchy : Form 
{ 
    DataSet ds = new DataSet(); 
    TreeNode parentNode = null; 

    DataSet RunQuery(String Query) 
    { 
     DataSet ds = new DataSet(); 
     OracleConnection con = new OracleConnection(OrgScheme.GetConnectionString()); 
     DataTable dt = new DataTable(); 
     OracleCommand cmd = new OracleCommand(); 
     cmd.CommandText = Query; 
     cmd.CommandType = CommandType.Text; 
     cmd.Connection = con; 
     con.Open(); 

     OracleDataAdapter da = new OracleDataAdapter(cmd); 
     ds = new DataSet(); 
     da.Fill(ds); 

     return ds; 

    } 

    void CreateNode(TreeNode node) 
    { 
     DataSet ds = RunQuery("select orgid ,parentid ... 0 and parentid=" + node.Value +" order by parentid,orgid"); 
     if (ds.Tables[0].Rows.Count == 0) 
     { 
      return; 
     } 
     for (int i = 0; i < ds.Tables[0].Rows.Count; i++) 
     { 
      TreeNode tnode = new TreeNode(ds.Tables[0].Rows[i][1].ToString(), ds.Tables[0].Rows[i][0].ToString()); 
      tnode.SelectAction = TreeNodeSelectAction.Expand; 
      node.ChildNodes.Add(tnode); 
      CreateNode(tnode); 
     } 

    } 

    public OrgHierarchy() 
    { 
     InitializeComponent(); 

     DataSet ds = RunQuery("select orgid ,parentid .... and parentid is null"); 
     for (int i = 0; i < ds.Tables[0].Rows.Count; i++) 
     { 
      TreeNode root = new TreeNode(ds.Tables[0].Rows[i][1].ToString(), ds.Tables[0].Rows[i][0].ToString()); 
      root.SelectAction = TreeNodeSelectAction.Expand; 
      CreateNode(root); 
      OrgTree.Nodes.Add(root); 
     } 

    } 
} 

У меня есть ряд ошибок:

Ошибка 1 'System.Windows.Forms.TreeNode' не содержит определения для 'Value' и никакой метод расширения «Значение», принимающий первый аргумент типа «System.Windows.Forms.TreeNode», может быть найден (вам не хватает.

Ошибка 2 Наилучшее перегруженное соответствие метода для 'System.Windows. Forms.TreeNode.TreeNode (строка, System.Wind ows.Forms.TreeNode []) 'имеет некоторые недопустимые аргументы

Помогите пожалуйста? Я думаю, что я использую веб-элементы управления (.Value), которые я не могу использовать с помощью WinForms.

+0

У вас есть нуль в корневом уровне в parentID? –

+0

@ user6002727 точно – Tiago

ответ

1

Сначала я изменить некоторую логику вашего кода

DataSet ds = new DataSet(); 
TreeNode parentNode = null; 
TreeView treeview = null; 
public OrgHierarchy() 
{ 
    InitializeComponent(); 

    DataSet ds = RunQuery("select orgid ,parentid .... and parentid is null"); 
    DataTable dt = ds.Tables[0]; 
    settingRootLevel(dt); 
    if (treeview.Nodes.Count > 0) 
    { 
      for (int i = 0; i < treeview.Nodes.Count; i++) 
      { 
       TreeNode node = treeview.Nodes[i]; 
       addChildNodes(dt, node); 
      } 
    } 

     this.Controls.Add(treeview); 

} 

DataSet RunQuery(String Query) 
{ 
    DataSet ds = new DataSet(); 
    OracleConnection con = new OracleConnection(OrgScheme.GetConnectionString()); 
    DataTable dt = new DataTable(); 
    OracleCommand cmd = new OracleCommand(); 
    cmd.CommandText = Query; 
    cmd.CommandType = CommandType.Text; 
    cmd.Connection = con; 
    con.Open(); 

    OracleDataAdapter da = new OracleDataAdapter(cmd); 
    ds = new DataSet(); 
    da.Fill(ds); 

    return ds; 

} 

    public void addChildNodes(DataTable dt,TreeNode Node) 
    { 

     DataRow[] datarows = dt.Select("PARENTID = " + Node.Text); 
     for (int i = 0; i < datarows.Length; i++) 
     { 
       TreeNode node = new TreeNode(datarows[i][0].ToString()); 
       Node.Nodes.Add(node); 
       addChildNodes(dt, node);  
     } 
    } 

    public void settingRootLevel(DataTable dt) 
    { 
     DataRow[] datarows = dt.Select("PARENTID is null"); 

     foreach (DataRow dr in datarows) 
     { 
      treeview.Nodes.Add(dr[0].ToString()); 
     } 

    } 

где settingRootLevel устанавливает все родительские узлы и addChildNodes запустить все ребенок с рекурсией, еще одна вещь, чтобы clearify, любезно сделать этот код в попытке поймать, если какой-либо произошло исключение.

Смежные вопросы