Introduction
This article demonstrates how to bind a DropDownList inside a GridView, and also shows how to bind a TextBox inside a GridView on the SelectedIndexChanged event of the DropDownList.
Using the Code
To start with, add the GridView control to your page, add the bound columns if any, then add two template columns: one for the DropDownList and one for the TextBox. Set the AutoPostBack property to "True" for the DropDownList, and create the SelectedIndexChanged event.
The ASPX code will look like:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false"
OnRowCommand="GridView1_RowCommand" OnRowDataBound="GridView1_RowDataBound">
<Columns>
<asp:BoundField DataField="CustomerID" HeaderText="Customer ID" />
<asp:BoundField DataField="CustomerName" HeaderText="Customer Name"/>
<asp:TemplateField HeaderText="Sample Dropdown">
<ItemTemplate>
<asp:DropDownList Width="50" runat="server"
id="ddlTest" AutoPostBack="true"
OnSelectedIndexChanged="ddlTest_SelectedIndexChanged">
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Sample Textbox">
<ItemTemplate>
<asp:TextBox ID="txtTest" runat="server"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
Let's move on to the code-behind.
The first thing to do is to bind the gird with some sample data. For the sake of simplicity, I am binding the sample data to the grid. For this, I am creating an object of the Customer class, assigning its properties with dummy data, and adding it to the list. Here is the code for this:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
List lst = new List();
Customer cust1 = new Customer();
cust1.CustomerID = 1;
cust1.CustomerName = "Customer1";
Customer cust2 = new Customer();
cust2.CustomerID = 2;
cust2.CustomerName = "Customer2";
Customer cust3 = new Customer();
cust3.CustomerID = 3;
cust3.CustomerName = "Customer3";
lst.Add(cust1);
lst.Add(cust2);
lst.Add(cust3);
GridView1.DataSource = lst;
GridView1.DataBind();
}
}
The second step is to bind the DropDownList with data. To achieve this, we have to use the RowDataBound event of the GridView. This event fires when we bind the data to the GridView. In this event, we need to find the DropDownList control of each row and bind it with some data. Again, for the sake of simplicity, I am binding it with dummy data by creating an object of the dummy class called "DropDownData" and adding these objects to the list, and finally, assigning this list as a datasource to the DropDownList:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
Control ctrl = e.Row.FindControl("ddlTest");
if (ctrl != null)
{
DropDownList dd = ctrl as DropDownList;
List lst = new List();
DropDownData cust1 = new DropDownData(1, "One");
DropDownData cust2 = new DropDownData(2, "Two");
lst.Add(cust1);
lst.Add(cust2);
dd.DataTextField = "Text";
dd.DataValueField = "ID";
dd.DataSource = lst;
dd.DataBind();
}
}
}
The third and most important step is to handle the SelectedIndexChanged event of the DropDownList. As we have to identify the exact Row of the GridView from where the SelectedIndexChanged event is fired, we need to compare the "ClientID" of the DropDownList with the dropdowns available in all the rows of the GridView. Once the CliendID is matched, we can bind the TextBox with some data of that Row. For simplicity, I am binding the DropDownList's SelectedValue data. You can fire a database query to get real data as well. Here is the code:
protected void ddlTest_SelectedIndexChanged(object sender, EventArgs e))
{
DropDownList ddl = sender as DropDownList;
foreach (GridViewRow row in GridView1.Rows)
{
Control ctrl = row.FindControl("ddlTest") as DropDownList;
if (ctrl != null)
{
DropDownList ddl1 = (DropDownList)ctrl;
if (ddl.ClientID == ddl1.ClientID)
{
TextBox txt = row.FindControl("txtTest") as TextBox;
txt.Text = ddl1.SelectedValue;
break;
}
}
}
}
Sample Classes
public class DropDownData
{
public DropDownData(int id, string displaytext)
{
iD = id;
text = displaytext;
}
int iD;
public int ID
{
get { return iD; }
set { iD = value; }
}
string text;
public string Text
{
get { return text; }
set { text = value; }
}
}
public class Customer
{
public int CustomerID
{
get;
set;
}
public string CustomerName
{
get;
set;
}
}
That's it...
I am from India, working as Sr. System Engineer in one of the reputed IT firm, having extensive experience on Asp.net, C#, Ajax.