© 2004 Microsoft Corporation. All rights reserved.
Figure 2 Getting the Data
<%@ Page language="C#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>

<script runat="server">
void Page_Load(Object sender, EventArgs e)
{
    BindData();
}

private void BindData()
{
    String strCmd = "SELECT employeeid, firstname, lastname FROM employees 
                    ORDER BY lastname";
    String strCnn = "INITIAL CATALOG=northwind;SERVER=localhost;INTEGRATED 
                    SECURITY=sspi;";
    
    SqlDataAdapter da = new SqlDataAdapter(strCmd, strCnn);
    DataSet ds = new DataSet();
    da.Fill(ds);
    
    // add a display only column
    DataColumn col = new DataColumn("EmployeeName", typeof(string), 
                     "lastname + ', ' + firstname");
    ds.Tables[0].Columns.Add(col);
    
    masterGrid.DataSource = ds.Tables[0];
    masterGrid.DataBind();
}

private void SelectedIndexChanged(Object sender, EventArgs e)
{
    BindChildData();
}

private void BindChildData()
{
    String strCnn = "INITIAL CATALOG=northwind;SERVER=localhost;INTEGRATED 
                     SECURITY=sspi;";
    SqlConnection conn = new SqlConnection(strCnn);
    String strCmd = "SELECT et.territoryid, td.territorydescription 
      FROM employeeterritories AS et INNER JOIN territories AS td 
      ON et.territoryid=td.territoryid WHERE et.employeeid=@nEmpID";
    SqlCommand cmd = new SqlCommand(strCmd, conn);

    int nEmpID = (int) masterGrid.DataKeys[masterGrid.SelectedIndex];
    SqlParameter p = new SqlParameter("@nEmpID", SqlDbType.Int);
    p.Value = nEmpID;
    cmd.Parameters.Add(p);
    
    SqlDataAdapter da = new SqlDataAdapter();
    da.SelectCommand = cmd;    
    DataSet ds = new DataSet();
    da.Fill(ds);
    
    
    detailGrid.DataSource = ds.Tables[0];
    detailGrid.DataBind();
}
Figure 4 Using DataBinding
<script runat="server">
void Page_Load(Object sender, EventArgs e)
{
    BindData();
}

private void BindData()
{
    String strCmd = "SELECT employeeid, firstname, lastname FROM 
                    employees ORDER BY lastname";
    String strCnn = "INITIAL CATALOG=northwind;
                    SERVER=localhost;INTEGRATED SECURITY=sspi;";
    
    SqlDataAdapter da = new SqlDataAdapter(strCmd, strCnn);
    DataSet ds = new DataSet();
    da.Fill(ds);

    // add a display only column
    DataColumn col = new DataColumn("EmployeeName", typeof(string), 
                     "lastname + ', ' + firstname");
    ds.Tables[0].Columns.Add(col);

    masterGrid.DataSource = ds.Tables[0];
    masterGrid.DataBind();
}

private void SelectedIndexChanged(Object sender, EventArgs e)
{
    detailGrid.DataBind();
}

private DataTable BindChildData(String strCnn, String strCmd, String 
    strParentID)
{
    DataGrid grid = (DataGrid) FindControl(strParentID);

    String strKeyField = grid.DataKeyField;
    int nP1 = (int) grid.DataKeys[grid.SelectedIndex];
    StringBuilder sb = new StringBuilder(strCmd);
    sb.Append(" WHERE ");
    sb.Append(strKeyField);
    sb.Append("=@p1");
    strCmd = sb.ToString();

    SqlConnection conn = new SqlConnection(strCnn);
    SqlCommand cmd = new SqlCommand(strCmd, conn);

    SqlParameter p = new SqlParameter("@p1", SqlDbType.VarChar);
    p.Value = nP1;
    cmd.Parameters.Add(p);

    SqlDataAdapter da = new SqlDataAdapter();
    da.SelectCommand = cmd;    
    DataSet ds = new DataSet();
    da.Fill(ds);

    return ds.Tables[0];
}
</script>
Figure 5 HDataGrid
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Text;
using System.Data;
using System.Data.SqlClient;

namespace BWSLib
{
    public class HDataGrid : DataGrid
    {
        // Constructor 
        public HDataGrid()
        {
            ConnectionString = String.Empty;
            ParentGrid = String.Empty;
            SqlCommandText = String.Empty;
            DataRelation = String.Empty;
         }

        
        //////////////////////////////////////////////
        /// PROPERTY: ConnectionString
        public String ConnectionString
        {
            get {return (String) ViewState["ConnectionString"];}
            set {ViewState["ConnectionString"] = value;}
        }

        //////////////////////////////////////////////
        /// PROPERTY: SqlCommandText
        public String SqlCommandText
        {
            get {return (String) ViewState["SqlCommandText"];}
            set {ViewState["SqlCommandText"] = value;}
        }

        
        //////////////////////////////////////////////
        /// PROPERTY: ParentGrid
        public String ParentGrid
        {
            get {return (String) ViewState["ParentGrid"];}
            set {ViewState["ParentGrid"] = value;}
        }

        //////////////////////////////////////////////
        /// PROPERTY: DataRelation
        public String DataRelation
        {
            get {return (String) ViewState["DataRelation"];}
            set {ViewState["DataRelation"] = value;}
        }

        //////////////////////////////////////////////
        /// OVERRIDE: DataBind
        public override void DataBind()
        {
            if (DataSource != null)
            {
                base.DataBind();
                return;
            }

            // DataSource has not been set yet and must be determined here
            if (SqlCommandText != String.Empty && 
                ConnectionString != String.Empty && 
                ParentGrid != String.Empty)
            {
                DataGrid grid = (DataGrid) Page.FindControl(ParentGrid);

                String strCmd = SqlCommandText;
                StringBuilder sb = new StringBuilder(strCmd);
                sb.Append(" WHERE ");
                sb.Append(grid.DataKeyField);
                sb.Append("=@p1");
                strCmd = sb.ToString();
      
                SqlConnection conn = new SqlConnection(ConnectionString);
                SqlCommand cmd = new SqlCommand(strCmd, conn);
    
                SqlParameter p = new SqlParameter("@p1", 
                                 SqlDbType.VarChar);
                p.Value = grid.DataKeys[grid.SelectedIndex];
                cmd.Parameters.Add(p);
    
                SqlDataAdapter da = new SqlDataAdapter();
                da.SelectCommand = cmd;    
                DataSet ds = new DataSet();
                da.Fill(ds);

                DataSource = ds.Tables[0];
            }
            else
            if (DataRelation != String.Empty && 
                ParentGrid != String.Empty)
            {
                DataGrid grid = (DataGrid) Page.FindControl(ParentGrid);
                DataView dvParent = (DataView) grid.DataSource;
                DataView dvChild = dvParent
                    [grid.SelectedIndex].CreateChildView(DataRelation);

                DataSource = dvChild;
            }

            base.DataBind();
        }
    }
}
Figure 6 Additional Properties
<expo:HDataGrid id="detailGrid" runat="server" 
    connectionstring="DATABASE=northwind;SERVER=localhost;UID=sa;"
    sqlcommandtext="SELECT et.territoryid, td.territorydescription 
    FROM employeeterritories AS et INNER JOIN 
    territories AS td ON 
    et.territoryid=td.territoryid"
    parentgrid="masterGrid"
    autogeneratecolumns="false"
    font-size="x-small" font-names="verdana">
    •••
    <Columns>
      <asp:BoundColumn DataField="territoryid" 
          HeaderText="ID" />
      <asp:BoundColumn DataField="territorydescription" 
          HeaderText="Territory" />
    </Columns>
</expo:HDataGrid>

Home
Topics
Issues
Code Downloads
Magazine Downloads
Subscribe
Submit an Article
RSS

MSDN Magazine