Thursday, February 7, 2008

Get unbound DropDownList value in GridView - .NET 2.0, C#

I've been looking for a solution to a problem when using one dropdownlist within a gridview to populate another dropdownlist.

The issue is that the databinding is broken on the second dropdownlist once you do this, so you can't use SelectedValue='<%# Bind("....") %>' or else you'll get an error when you go to do an update to your database. ("Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control. ").

The solution I've come up with is to create a hidden field that can hold the value of the selection from the second dropdownlist, then use a client-side javascript to find and store the value from this dropdownlist into the hidden field. The control is server-side so when I do my database update I can simply find the hiddenfield.value.

I've attached the relevant code below. The only trick is to do a little server-side/client-side tie by passing the javascript the ClientIDs of the controls that are involved (since they'll be named dynamically).

Here's the relevant code snippets:

***javascript***

<script type="text/javascript">
function jobTitleToHiddenField(strListClientID, strHiddenFieldClientID)
{
var strJobTitle = document.getElementById(strListClientID).value;
var hiddenField = document.getElementById(strHiddenFieldClientID);
hiddenField.value = strJobTitle;
}
</script>

***hidden textbox***

<asp:HiddenField ID="hfJobTitle" runat="server" />

***dropdown in template field***

<EditItemTemplate>
<asp:DropDownList ID="lstJobTitles" runat="server" DataSourceID="dsJobTitles"
DataTextField="Title" DataValueField="Title" OnPreRender="lstJobTitles_PreRender" ></asp:DropDownList>
</EditItemTemplate>

***code behind***

protected void lstJobTitles_PreRender(object sender, EventArgs e)
{
DropDownList ddlist = sender as DropDownList;
string strListClientID = ddlist.ClientID;
string strHiddenFieldClientID = hfJobTitle.ClientID;
ddlist.Attributes.Add("onchange", "jobTitleToHiddenField(’" + strListClientID + "’, ‘" + strHiddenFieldClientID + "’);");
}

then you can get the value in the code behind anywhere you need it with…

string strTitle = hfJobTitle.Value;

No comments: