how to bind a DataGrid to a join of two tables in a DataSet?

  • Thread starter Bennett Haselton
  • Start date
B

Bennett Haselton

I know how to create a DataAdapter that loads data from a data source
into a table in a typed DataSet, and how to set the DataSource and
DataMember properties of a DataGrid so that at run time it will load
the data from that table in the DataSet.

Assuming I've got two tables in the DataSet, how can I set the
DataSource property of the DataGrid to be an inner join of the two
tables in the DataSet?

If I want the DataGrid to get data from just one table, I set the
DataSource property to be an instance of the typed DataSet, and the
DataMember property to be the table where I want to get the data. But
if I want to do an inner join, it's not intuitive to me what to do
instead, and none of the examples in my ASP books show how to do it.

I could create the *DataAdapter* so that it does an inner join to load
the data into the DataSet in the first place. But that's inefficient
if I'm already loading the contents of Table1 and Table2 into the
DataSet for use by some other controls on the page, then if I load a
join of Table1 and Table2 into the DataSet as well, then I'd probably
be loading the entire contents of at least one of the tables twice.
Doing a join on data already in memory seems more efficient.

-Bennett
 
M

Martin Dechev

Hi,

You can add the relationship between the two tables and then get the
parent/child rows' values when databinding. The following example uses the
Northwind database, maybe it will be of help to you:

void BindGrid()
{
System.Data.DataSet ds =
new System.Data.DataSet();
System.Data.SqlClient.SqlConnection conn =
new System.Data.SqlClient.SqlConnection(
@"server=(local);database=Northwind;user id=user;password=pass");
System.Data.SqlClient.SqlDataAdapter da =
new System.Data.SqlClient.SqlDataAdapter(
@"SELECT CustomerID, CompanyName FROM Customers",
conn);
conn.Open();
da.Fill(ds, "Customers");
da = new System.Data.SqlClient.SqlDataAdapter(
@"SELECT OrderID, OrderDate, CustomerID, ShipAddress FROM Orders",
conn);
da.Fill(ds, "Orders");
ds.Relations.Add("CustID",
ds.Tables["Customers"].Columns["CustomerID"],
ds.Tables["Orders"].Columns["CustomerID"]);
DataGrid1.DataSource = ds.Tables["Orders"];
DataGrid1.DataBind();
}

<asp:datagrid id="DataGrid1" runat="server" autogeneratecolumns="False">
<columns>
<asp:templatecolumn headertext="Order ID"><itemtemplate><%#
DataBinder.Eval(Container.DataItem, "OrderID")
%></itemtemplate></asp:templatecolumn>
<asp:templatecolumn headertext="Order Date"><itemtemplate><%#
DataBinder.Eval(Container.DataItem, "OrderDate", "{0:dd MMM yyyy}")
%></itemtemplate></asp:templatecolumn>
<asp:templatecolumn headertext="Customer ID"><itemtemplate><%#
DataBinder.Eval(Container.DataItem, "CustomerID")
%></itemtemplate></asp:templatecolumn>
<asp:templatecolumn headertext="Company Name"><itemtemplate><%#
(Container.DataItem as
System.Data.DataRowView).Row.GetParentRow("CustID")["CompanyName"]
%></itemtemplate></asp:templatecolumn>
</columns>
</asp:datagrid>

Hope this helps
Martin
 
B

Bennett Haselton

Thanks, that was very generous of you to post a complete example with
working code -- I modified the example for my project and it worked as
well!

I was hoping to find a smooth way to do it in the designer, just since
that reduces the chances of coding errors, but sometimes you have to
*GROAN* type.

-Bennett

Martin Dechev said:
Hi,

You can add the relationship between the two tables and then get the
parent/child rows' values when databinding. The following example uses the
Northwind database, maybe it will be of help to you:

void BindGrid()
{
System.Data.DataSet ds =
new System.Data.DataSet();
System.Data.SqlClient.SqlConnection conn =
new System.Data.SqlClient.SqlConnection(
@"server=(local);database=Northwind;user id=user;password=pass");
System.Data.SqlClient.SqlDataAdapter da =
new System.Data.SqlClient.SqlDataAdapter(
@"SELECT CustomerID, CompanyName FROM Customers",
conn);
conn.Open();
da.Fill(ds, "Customers");
da = new System.Data.SqlClient.SqlDataAdapter(
@"SELECT OrderID, OrderDate, CustomerID, ShipAddress FROM Orders",
conn);
da.Fill(ds, "Orders");
ds.Relations.Add("CustID",
ds.Tables["Customers"].Columns["CustomerID"],
ds.Tables["Orders"].Columns["CustomerID"]);
DataGrid1.DataSource = ds.Tables["Orders"];
DataGrid1.DataBind();
}

<asp:datagrid id="DataGrid1" runat="server" autogeneratecolumns="False">
<columns>
<asp:templatecolumn headertext="Order ID"><itemtemplate><%#
DataBinder.Eval(Container.DataItem, "OrderID")
%></itemtemplate></asp:templatecolumn>
<asp:templatecolumn headertext="Order Date"><itemtemplate><%#
DataBinder.Eval(Container.DataItem, "OrderDate", "{0:dd MMM yyyy}")
%></itemtemplate></asp:templatecolumn>
<asp:templatecolumn headertext="Customer ID"><itemtemplate><%#
DataBinder.Eval(Container.DataItem, "CustomerID")
%></itemtemplate></asp:templatecolumn>
<asp:templatecolumn headertext="Company Name"><itemtemplate><%#
(Container.DataItem as
System.Data.DataRowView).Row.GetParentRow("CustID")["CompanyName"]
%></itemtemplate></asp:templatecolumn>
</columns>
</asp:datagrid>

Hope this helps
Martin
Bennett Haselton said:
I know how to create a DataAdapter that loads data from a data source
into a table in a typed DataSet, and how to set the DataSource and
DataMember properties of a DataGrid so that at run time it will load
the data from that table in the DataSet.

Assuming I've got two tables in the DataSet, how can I set the
DataSource property of the DataGrid to be an inner join of the two
tables in the DataSet?

If I want the DataGrid to get data from just one table, I set the
DataSource property to be an instance of the typed DataSet, and the
DataMember property to be the table where I want to get the data. But
if I want to do an inner join, it's not intuitive to me what to do
instead, and none of the examples in my ASP books show how to do it.

I could create the *DataAdapter* so that it does an inner join to load
the data into the DataSet in the first place. But that's inefficient
if I'm already loading the contents of Table1 and Table2 into the
DataSet for use by some other controls on the page, then if I load a
join of Table1 and Table2 into the DataSet as well, then I'd probably
be loading the entire contents of at least one of the tables twice.
Doing a join on data already in memory seems more efficient.

-Bennett
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,995
Messages
2,570,230
Members
46,816
Latest member
SapanaCarpetStudio

Latest Threads

Top