我是菜鳥。ASP.NET
目的:輸入料號以TreeView展現其BOM
這是鼎新 workflow erp的Bom表
MD001是主件料號,MD003是子件料號
我的做法是先產生某一主件相關父子件的DataTable,
再利用此DataTable去構建TreeView:
在getBOM輸入主件料號:例如10100116544,
就產生下面的DataTable (沒Level那欄也沒差,只是展示用)
| 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的結合。
No comments:
Post a Comment