[Transfer]二种嵌套的DataGrid数据表格方法[DataRelation,FindControl]
http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpguide/html/cpconnesteddatarelations.asp
MSDN Home >  .NET Framework >  使用 .NET Framework 编程 >  通过 ADO.NET 访问数据 >  XML 和 DataSet  
.NET Framework 开发员指南   
嵌套的 DataRelation
在数据的关系表示形式中,各个表都包含使用一个列或一组列来相互关联的行。在 ADO.NET DataSet 中,表之间的关系使用 DataRelation 来实现。当创建 DataRelation 时,列的父子关系仅通过关系来管理。表和列是独立的实体。在 XML 提供的数据的分层表示形式中,父子关系通过包含嵌套子元素的父元素来表示。为了方便子对象在 DataSet 与 XmlDataDocument 同步或使用 WriteXml 以 XML 数据形式来编写时进行嵌套,DataRelation 会公开 Nested 属性。如果将 DataRelation 的 Nested 属性设置为 true,将使关系的子行在以 XML 数据形式编写或与 XmlDataDocument 同步时嵌套在父列中。默认情况下,DataRelation 的 Nested 属性为 false。例如,考虑以下 DataSet:

2

3
[Visual Basic]4
Dim nwindConn As SqlConnection = New SqlConnection("Data Source=localhost;" & _5
                                            "Integrated Security=SSPI;Initial Catalog=Northwind;")6
Dim custDA As SqlDataAdapter = New SqlDataAdapter("SELECT CustomerID, CompanyName FROM Customers", nwindConn)7
Dim orderDA As SqlDataAdapter = New SqlDataAdapter("SELECT OrderID, CustomerID, OrderDate FROM Orders", nwindConn)8

9
nwindConn.Open()10

11
Dim custDS As DataSet = New DataSet("CustomerOrders")12
custDA.Fill(custDS, "Customers")13
orderDA.Fill(custDS, "Orders")14

15
nwindConn.Close()16

17
Dim custOrderRel As DataRelation = custDS.Relations.Add("CustOrders",18
                     custDS.Tables("Customers").Columns("CustomerID"),19
                     custDS.Tables("Orders").Columns("CustomerID"))20

21
[C#]22
SqlConnection nwindConn = new SqlConnection("Data Source=localhost;" +23
                                            "Integrated Security=SSPI;Initial Catalog=Northwind;");24
SqlDataAdapter custDA = new SqlDataAdapter("SELECT CustomerID, CompanyName FROM Customers", nwindConn);25
SqlDataAdapter orderDA = new SqlDataAdapter("SELECT OrderID, CustomerID, OrderDate FROM Orders", nwindConn);26

27
nwindConn.Open();28

29
DataSet custDS = new DataSet("CustomerOrders");30
custDA.Fill(custDS, "Customers");31
orderDA.Fill(custDS, "Orders");32

33
nwindConn.Close();34

35
DataRelation custOrderRel = custDS.Relations.Add("CustOrders",36
                     custDS.Tables["Customers"].Columns["CustomerID"],37
                     custDS.Tables["Orders"].Columns["CustomerID"]);38

39

因为对于该 DataSet,DataRelation 的 Nested 属性未设置为 true,所以当该 DataSet 表示为 XML 数据时,子对象将不会嵌套在父元素中。
以下代码显示对 DataSet 调用 WriteXml 将生成的输出。


<CustomerOrders>
  <Customers>
    <CustomerID>ALFKI</CustomerID>
    <CompanyName>Alfreds Futterkiste</CompanyName>
  </Customers>
  <Customers>
    <CustomerID>ANATR</CustomerID>
    <CompanyName>Ana Trujillo Emparedados y helados</CompanyName>
  </Customers>
  <Orders>
    <OrderID>10643</OrderID>
    <CustomerID>ALFKI</CustomerID>
    <OrderDate>1997-08-25T00:00:00</OrderDate>
  </Orders>
  <Orders>
    <OrderID>10692</OrderID>
    <CustomerID>ALFKI</CustomerID>
    <OrderDate>1997-10-03T00:00:00</OrderDate>
  </Orders>
  <Orders>
    <OrderID>10308</OrderID>
    <CustomerID>ANATR</CustomerID>
    <OrderDate>1996-09-18T00:00:00</OrderDate>
  </Orders>
</CustomerOrders>

请注意,Customers 元素和 Orders 元素显示为同辈元素。如果您要让 Orders 元素显示为它们各自父元素的子元素,则需要将 DataRelation 的 Nested 属性设置为 true,为此将添加以下代码:
[Visual Basic]
custOrderRel.Nested = True
[C#]
custOrderRel.Nested = true;
以下代码显示当 Orders 元素嵌套在它们各自的父元素中时所生成的输出的可能形式。

2

3
<CustomerOrders>4
  <Customers>5
    <CustomerID>ALFKI</CustomerID>6
    <Orders>7
      <OrderID>10643</OrderID>8
      <CustomerID>ALFKI</CustomerID>9
      <OrderDate>1997-08-25T00:00:00</OrderDate>10
    </Orders>11
    <Orders>12
      <OrderID>10692</OrderID>13
      <CustomerID>ALFKI</CustomerID>14
      <OrderDate>1997-10-03T00:00:00</OrderDate>15
    </Orders>16
    <CompanyName>Alfreds Futterkiste</CompanyName>17
  </Customers>18
  <Customers>19
    <CustomerID>ANATR</CustomerID>20
    <Orders>21
      <OrderID>10308</OrderID>22
      <CustomerID>ANATR</CustomerID>23
      <OrderDate>1996-09-18T00:00:00</OrderDate>24
    </Orders>25
    <CompanyName>Ana Trujillo Emparedados y helados</CompanyName>26
  </Customers>27
</CustomerOrders>28

29

SQL 运用
C#版本,已测试!2

3
<%@ Page language="c#"%>4
<%@ Import Namespace="System.Data" %>5
<%@ Import Namespace="System.Data.SqlClient" %>6
<HTML>7
<body>8
<script language="c#" runat="server">9
public void Page_Load(object sender, EventArgs e)10
        {11
            // 为Authors表创建 Connection 和 DataAdapter12
 13
        14

15
    16
             SqlConnection cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["Pubs"].ConnectionString);17
            SqlDataAdapter cmd1 = new SqlDataAdapter("select * from authors", cnn);18

19
            //创建填充 DataSet.20
            DataSet ds = new DataSet();21
            cmd1.Fill(ds, "authors");22

23
            // 为Titles表创建 DataAdapter24
            SqlDataAdapter cmd2 = new SqlDataAdapter("select * from titleauthor", cnn);25
            cmd2.Fill(ds, "titles");26

27
            // 创建 Authors 表和 Titles 表之间的关系.28
            ds.Relations.Add("myrelation",29
              ds.Tables["authors"].Columns["au_id"],30
              ds.Tables["titles"].Columns["au_id"]);31

32
            // 绑定Authors到父Repeater33
            parentRepeater.DataSource = ds.Tables["authors"];34
            Page.DataBind();35

36
            cnn.Close();37
            cnn.Dispose();38
        }39
</script>40
<form id="Form1" runat="server">41
<!-- 父Repeater开始 -->42
<asp:repeater id="parentRepeater" runat="server">43
  <itemtemplate>44
    <b>45
      <%# DataBinder.Eval(Container.DataItem,"au_id") %>46
    </b>47
    <br>48
    <!-- 子Repeater开始 -->49
    <asp:repeater id="childRepeater" runat="server" 50
     datasource='<%# ((DataRowView)Container.DataItem).Row.GetChildRows("myrelation") %>'>51
      <itemtemplate>52
        <%# DataBinder.Eval(Container.DataItem, "[\"title_id\"]")%>53
        <br>54
      </itemtemplate>55
    </asp:repeater>56
    <!-- 子Repeater结束 -->57
  </itemtemplate>58
</asp:repeater>59
<!-- 父Repeater结束 -->60
</form>61
</body>62
</HTML>63

64


2
<%@ Page Language="VB"%>3
<%@ Import Namespace="System.Data" %>4
<%@ Import Namespace="system.Data.SqlClient"%>5

6
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";>7

8
<html xmlns="http://www.w3.org/1999/xhtml"; >9
<head runat="server">10
    <title>DataRelation</title>11
    12

13
<script language="vb" runat="server">14

15
            16
            Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)17
                18
          19
                Dim cnn As SqlConnection = New SqlConnection(ConfigurationManager.ConnectionStrings("Pubs").ConnectionString)20
               21
        Dim ds As New DataSet()22
        23
        Dim cmd1 As SqlDataAdapter24
        25
        cmd1 = New SqlDataAdapter("select * from [Authors]", cnn)26
        cmd1.Fill(ds, "Authors")27
                Dim cmd2 As SqlDataAdapter28
        cmd2 = New SqlDataAdapter("select * from [titleauthor]", cnn)29
                cmd2.Fill(ds, "titles")30

31

32
                'Create the relation bewtween the Authors and Titles tables.33
        ds.Relations.Add("myrelation", ds.Tables("authors").Columns("au_id"), ds.Tables("titles").Columns("au_id"))34

35

36
                'Bind the Authors table to the parent Repeater control, and call DataBind.37
        parentRepeater.DataSource = ds.Tables("Authors")38
        'Page.DataBind()39
        40
        parentRepeater.DataBind()41
     42
                43
            End Sub44
          45
    46
</script>47

48

49
</head>50
<body>51
    <form id="form1" runat="server">52
    <div>53
    <!-- start parent repeater -->54
<asp:repeater id="parentRepeater" runat="server">55
   <itemtemplate>56
      <b><%#DataBinder.Eval(Container.DataItem, "[au_id]")%></b><br>  57
      58

59

60
       <!-- 子Repeater开始 -->61
    <asp:repeater id="childRepeater" runat="server"  datasource='<%# CType(Container.DataItem, DataRowView).Row.GetChildRows("myrelation") %>'>62
      <itemtemplate>63
        vb.net:2级- <%#Eval("[au_ord]")%>64
        <br>65
      </itemtemplate>66
    </asp:repeater>67
    <!-- 子Repeater结束 -->68

69
   </itemtemplate>70
</asp:repeater>71
        72
<!-- end parent repeater -->73

74

75
    </div>76
    </form>77
</body>78
</html>79

80

二、DataGridParent.Items(i).FindControl("DataGridChild") 方法
<%@ Page Language="VB" Debug="true"%>2
<%@ Import Namespace="System.Data" %>3
<%@ Import Namespace="system.Data.SqlClient"%>4
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";>5

6
<html xmlns="http://www.w3.org/1999/xhtml"; >7
<head id="Head1" runat="server">8
    <title>vb-DataRelation03</title>9
    <script language="vb" runat="server">10
        11
        Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)12
            Dim conn As SqlConnection = New SqlConnection(ConfigurationManager.ConnectionStrings("Northwind").ConnectionString)13
            Dim str As String = "select top 5  [orderID],[customerID],[orderDate] From [Orders]"14
            15
            Dim adapter As SqlDataAdapter = New SqlDataAdapter(str, conn)16
 17
            Dim ds As New DataSet18
            19
            Dim mytable As New DataTable() ''一定要建立DATATABLE20
            adapter.Fill(ds, "Orders")21
            mytable = ds.Tables("Orders")22
          23
            '  Me.DataGridParent.DataSource = 24
            Me.DataGridParent.DataSource = ds.Tables("Orders").DefaultView25
            26
            Me.DataGridParent.DataBind()27
            28
            Dim i As Integer29
    30
            31
        32
       33
            34
            For i = 0 To mytable.Rows.Count - 135
                '這句非常關鍵..36
                Dim DataGridChild As DataGrid = Me.DataGridParent.Items(i).FindControl("DataGridChild")37
                Dim str2 As String = "select [orderID],[ProductID] From [Order Details] where [orderID]='" + mytable.Rows(i).Item(0).ToString + "'"38
                Dim ds2 As New DataSet39
                40
                Dim adapter2 As SqlDataAdapter41
                adapter2 = New SqlDataAdapter(str2, conn)42
                adapter2.Fill(ds2, "ordersDetails")43
                DataGridChild.DataSource = ds2.Tables("ordersDetails").DefaultView44
                DataGridChild.DataBind()45
                           46
                47
                48
                49
            Next50
            51
           52
             53
        End Sub54
    </script>55
</head>56
<body>57
    <form id="form1" runat="server">58
    <div>59
        <asp:DataGrid AutoGenerateColumns="False"  ID="DataGridParent" runat="server" Width="166px" ShowHeader="False">60
         <columns>61
 <asp:TemplateColumn>62
 <itemtemplate>63
         <%# DataBinder.Eval (container.DataItem,"orderID") %>64
         <asp:DataGrid AutoGenerateColumns="False" ID="DataGridChild" runat="server" Width="227px" ShowHeader="False">65
         <Columns>66
         <asp:TemplateColumn>67
         <ItemTemplate >68
             
<%#DataBinder.Eval(Container.DataItem, "ProductID")%>69
         </ItemTemplate>70
         </asp:TemplateColumn>71
         </Columns>72
        </asp:DataGrid>73
     </itemtemplate>74
 </asp:TemplateColumn>75
 </columns>76
        77
        </asp:DataGrid>78
    </div>79
    </form>80
</body>81
</html>82

                    
                
        
                
            
        
浙公网安备 33010602011771号