DropDownList in GridView

It is necessary to convert bound field to a template field, then set your DropDownList up. In the example it is bound to an ObjectDataSource. It is possible to use statement like (SelectedValue=<%# Bind("Field") %>), but this way is good only for read-only gridview.
Any postback can throw an exception connected to the Bind/Eval way of binding -
'Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control'.

The better way is by using customized code during processing the ItemUpdating event:

<asp:TemplateField HeaderText="Header text">
<asp:DropDownList ID="ddlItem"
runat="server" OnDataBound="ddlItems_DataBound"
DataSourceID="ObjectDataSource1" AppendDataBoundItems="false"
DataTextField="Name" DataValueField="Id" >

protected void ddlItems_DataBound(object sender, EventArgs e)
DropDownList ddl = (DropDownList)sender;
GridViewRow gvr = (GridViewRow)ddl.NamingContainer;
if (gvr.DataItem != null)
string id = ((DataRowView)gvr.DataItem)["Id"].ToString();
ListItem li = ddl.Items.FindByValue(id);
if (li != null) li.Selected = true;

It is important to use cast of sender, not direct calling to the GridView1 control. Every GridViewRow is actually DetailsView object.

protected void GridView1_RowUpdating
(object sender, GridViewUpdateEventArgs e)
DropDownList ddl =
e.NewValues["Id"] = ddl.SelectedValue;

No comments:

Post a Comment