2013-05-23 34 views
7

Trong MSDN họ nói về điều khiển TreeView ("Ràng buộc để dữ liệu" đoạn):Binding ASP.NET TreeView kiểm soát để một Dataset

Việc kiểm soát TreeView cũng có thể được liên kết với một đối tượng XmlDocument hay DataSet đối tượng có quan hệ. Để liên kết với một trong các nguồn dữ liệu này, đặt thuộc tính DataSource của điều khiển TreeView thành nguồn dữ liệu và sau đó gọi phương thức DataBind.

Vì vậy, trong một trang WebForms đơn giản với chỉ một TreeView i đã viết:

 DataSet ds = new DataSet(); 
    DataTable dt = new DataTable("Masters"); 
    ds.Tables.Add(dt); 
    dt.Columns.Add("MasterId", typeof(Int32)); 
    dt.Columns.Add("Name", typeof(String)); 
    DataTable dt1 = new DataTable("Details"); 
    ds.Tables.Add(dt1); 
    dt1.Columns.Add("DetailId", typeof(Int32)); 
    dt1.Columns.Add("MasterId", typeof(Int32)); 
    dt1.Columns.Add("Name", typeof(String)); 

    DataRow rw; 
    DataRow rw1; 
    for (int i = 0; i < 5; i++) 
    { 
     rw=dt.NewRow(); 
     dt.Rows.Add(rw); 
     rw["MasterId"] = i; 
     rw["Name"] = "Master Name " + i.ToString(); 
     for (int j = 0; j < 10; j++) 
     { 
      rw1 = dt1.NewRow(); 
      dt1.Rows.Add(rw1); 
      rw1["DetailId"] = i * 5 + j; 
      rw1["MasterId"] = i; 
      rw1["Name"] = "Detail Name " + j.ToString() + " of Master Name "+ i.ToString(); 
     } 
    } 
    ds.Relations.Add(new DataRelation("Masters_Details",dt.Columns["MasterId"], dt1.Columns["MasterId"])); 
    TreeView1.DataSource = ds; 
    TreeView1.DataBind(); 

Nhưng trong dòng nơi tôi đặt DataSource nó ném ngoại lệ:

HierarchicalDataBoundControl chỉ chấp nhận các nguồn dữ liệu mà thực hiện IHierarchicalDataSource hoặc IHierarchicalEnumerable.

Tôi hiểu điều này xảy ra vì DataSet không thực hiện giao diện như vậy ... vậy tại sao họ viết có thể liên kết với "DataSet with relations"? Cảm ơn bạn trước

+1

Có thể hữu ích: http://www.codeproject.com/Articles/25753/Binding-the-ASP -NET-TreeView-to-a-DataSet-or-an-Ob Mặc dù, nó không giải thích ngôn ngữ trong tài liệu. –

+1

tks tôi đọc bài viết đó .... và rất nhiều trong số đó, nơi TreeView đã điền nút bằng nút ... nhưng điểm mấu chốt của câu hỏi của tôi là ** tại sao ** họ nói là có thể theo cách riêng. –

+0

Trong trường hợp như vậy trên MSDN, tôi thường đánh giá chủ đề không hữu ích và sau đó đưa ra giải thích về lý do của tôi hoặc những gì nên ở đó thay thế. ví dụ: ví dụ cho trường hợp đó, bạn có thể nghĩ ra điều gì gần nhất. –

Trả lời

0

Mã này cho biết cách chuyển từ bảng phân cấp sang TreeView. Không có gì phức tạp ở đây, nhưng một vài thủ thuật là cần thiết để làm cho nó hoạt động.

Bí quyết đầu tiên là sắp xếp các bản ghi của ParentID. Chúng ta không thể chèn một nút vào cây cho đến khi nút cha của nó nằm trong cây. Điều này ngụ ý một trường hợp đặc biệt, nơi nút gốc của cây phải được chèn đầu tiên vì nó không có cha mẹ.

Đây là dữ liệu mẫu:

// Create the DataTable and columns 
DataTable ItemTable = new DataTable("MyTable"); 
ItemTable.Columns.Add("ID"  , typeof(int )); 
ItemTable.Columns.Add("ParentID", typeof(int )); 
ItemTable.Columns.Add("Name" , typeof(String)); 

// add some test data 
ItemTable.Rows.Add(new object[] { 0,-1, "Bill Gates" }); 
ItemTable.Rows.Add(new object[] { 1, 0, "Steve Ballmer" }); 
ItemTable.Rows.Add(new object[] { 3, 1, "Mary Smith" }); 
ItemTable.Rows.Add(new object[] { 2, 0, "Paul Allen" }); 
ItemTable.Rows.Add(new object[] { 4, 2, "Ahmed Jones" }); 
ItemTable.Rows.Add(new object[] { 5, 2, "Wing Lee"  }); 

// Use the Select method to sort the rows by ParentID 
DataRow[] SortedRows; 
SortedRows = ItemTable.Select("", "ParentID"); 

Tôi hy vọng bạn tìm thấy điều này hữu ích,

+0

Cảm ơn bạn đã quan tâm đến câu hỏi của tôi, nhưng những gì bạn đã viết là dành cho nút TreeView bằng nút khác một chút so với tính năng liên kết sử dụng. –

+0

Nhưng trong mã của bạn, bạn đã nhận được lỗi dưới đây HierarchicalDataBoundControl chỉ chấp nhận các nguồn dữ liệu thực hiện IHierarchicalDataSource hoặc IHierarchicalEnumerable. – CollectMeNow

+0

Có, nhưng trong [MSDN] (http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.treeview.aspx) họ đã viết có thể liên kết với một Tập dữ liệu ... tại sao họ có viết cái này không? –

Các vấn đề liên quan