Wednesday, May 6, 2009

使用TreeView呈現料號的Bom(ASP.NET)

我是菜鳥。ASP.NET

目的:輸入料號以TreeView展現其BOM

image

這是鼎新 workflow erp的Bom表

image

MD001是主件料號,MD003是子件料號

我的做法是先產生某一主件相關父子件的DataTable,

再利用此DataTable去構建TreeView:

在getBOM輸入主件料號:例如10100116544,

就產生下面的DataTable (沒Level那欄也沒差,只是展示用)

image

public DataTable getTable(string PN)   {
   DataTable dt = new DataTable("BOM");  //先把DataTable的結構建好
   dt.Columns.Add("father", typeof(string)); //新增三個欄位
   dt.Columns.Add("Son", typeof(string));
   dt.Columns.Add("Level",typeof(int));
   bomTable (PN, ref dt, -1); //呼叫傳回DataTable的 Method
    return dt; }
 
private void bomTable(string PN, ref DataTable dt,int level)    {
  ++level;      //怕無窮迴圈,所以限定10,沒有也沒差
   if (level <=10)     {
string sql = "select RTRIM(MD003) from BOMMD where MD001=@PN";
  DataRow dr;
      using (SqlConnection cn = new SqlConnection(wwconnectionString)) {
  SqlCommand cmd = new SqlCommand(sql, cn);
  cmd.Parameters.Add("@PN", SqlDbType.NChar).Value = PN;
  if (cn.State != ConnectionState.Open)
     cn.Open();
  SqlDataReader reader = cmd.ExecuteReader();
  cmd.Dispose();
  if (reader.HasRows){ //假如有row
      while (reader.Read()) {  
            dr = dt.NewRow();
            dr[0] = PN;
            dr[1] = reader.GetString(0);
            dr[2] =level;
            dt.Rows.Add(dr);
            bomTable (reader.GetString(0), ref dt,level); //作遞迴
                                   }reader.Close();}}}}
 
 

得到DataTable後,就開始建Tree,網頁上已有一個TreeView2,

作法是先把此 Tree的所以有Node先建立好,在加入TreeView裡。

TreeNode newNode = new TreeNode();  // 建立Root Node
newNode.Value = “10100116544”;
newNode.Text = “10100116544”;
DataTable dt = proxy.getTable(“10100116544”)
if (dt != null)  //假如有主件的相關主附件列表,就進入buildTree建立子Node
TreeView2.Nodes.Add( bulidTree(newNode));
else TreeView2.Nodes.Add(newNode);  //沒有也是要建root Node
 
private TreeNode bulidtree(TreeNode node)    {
string expression;  //加入篩選條件,找出父件是xx的所有子件
expression = "father='" + node.Value+"'";
if (dt.Select(expression) != null) {     
     foreach (DataRow dr in dt.Select(expression))        
          { TreeNode sunNode = new TreeNode();              
        sunNode.Text = dr[1].ToString();       子結點顯示的文字       
        sunNode.Value = dr[1].ToString();               
        node.ChildNodes.Add(sunNode);      把子件的結點加入父件的子結點  
        bulidtree(sunNode);    }         //遞迴
         }
 return node ;  }

有更好的方式歡迎指教,下面是GrideView及TreeView的結合。


gridviewtreeview

No comments:

Post a Comment