Master-Detail در Grid


پیش فرض:
در Database دو Table به مرتبط با مشخصات زیر وجود دارند:

“Categories” table
ID, CategoryName
“Products” table
      ID, ProductName, CategoryID

بین این دو Table یک Relation بواسطه ID در “categories” و CategoryID در “Products” وجود دارد.

هدف:
نمایش همزمان Category ها و Product ها را در یک Gridview



روش:
در حقیقت در شکل فوق دو gridview وجود دارد، به این معنی که در template column در gridview اول، gridview دیگر گذاشته شده است.
پس از ایجاد دو gridview به ترتیبی که گفته شد کدهای زیر را برای پر کردن Gridview ها در Page_Load می نویسیم.
دقت کنید که در Select Command برای Data adapter برای دو Table دستور Select نوشته شده است:
C#:
            System.Data.SqlClient.SqlDataAdapter da;
            da = new System.Data.SqlClient.SqlDataAdapter("select * from categories;select * from products","Data Source=.;Initial Catalog=TrainingDB;Integrated Security=True");
            System.Data.DataSet ds;
            ds = new System.Data.DataSet();
            da.Fill(ds);
ds.Tables[0].TableName = "Categories";
            ds.Tables[1].TableName = "Products";
VB.NET:
Dim da As New SqlClient.SqlDataAdapter("select * from maincategories;select * from Products", SqlConnection1)
      Dim ds As New DataSet
 da.Fill(ds)
 ds.Tables(0).TableName = "Categories"
 ds.Tables(1).TableName = "Products"

ساختن Relation و اضافه کردن آن به Dataset:

C#:
            System.Data.DataColumn ParentDC = ds.Tables["Categories"].Columns["id"];
            System.Data.DataColumn ChildDC = ds.Tables["Products"].Columns["Categoryid"];
            System.Data.DataRelation dr;
            dr = new System.Data.DataRelation("Categories_Products", ParentDC, ChildDC);
            ds.Relations.Add(dr);

VB.NET
        Dim Parent As DataColumn = ds.Tables("Categories").Columns("ID")
        Dim Child As DataColumn = ds.Tables("Products").Columns("CategoryID")

        Dim CategoryRelation As DataRelation = New DataRelation("Categories_Products", Parent, Child, False)
        ds.Relations.Add(Categories_Products)

پر کردن Gridview اول:

C#
            GridView1.DataSource = ds.Tables["Categories"].DefaultView;
            GridView1.DataBind();
VB.NET:
        DataGrid1.DataSource = ds.Tables("Categories").DefaultView
        DataGrid1.DataBind()

پر کردن Gridview دوم:
این کد باید برای Datasource مربوط به Gridview دوم نوشته شود و نه در Page_load، اگر نمی دانید که چگونه آنرا از طریق Property و Wizard وارد کنید، آن را در محیط  HTMLبرای Gridview دوم و در DataSource property آن بنویسید.

خود کد برای VB.NET به این ترتیب است:

CType(Container.DataItem,DataRowView).CreateChildView("Categories_Products”)
حتما متوجه شده اید این کد برساس ID هر سط و Relation تعریف شده برای Gridview موجود در آن سطر، Datasource سازد.
کد برای C#:

((System.Data.DataRowView)Container.DataItem).CreateChildView("Categories_Products")