So i have a dropdownlist in a gridview that i am attempting to get selectvalues from to update my database. My problem is: is that when press the update button, it ignores what was selected for the selected value and grabs what the first value is set to when the dropdownlist was first loaded.
So my question is: is how do obtain the selected value from a dropdownlist during the update event of a gridview.
Below you will find my codebehind, and the markup for the gridview.
codebehind:
/// <summary>
/// Handles the Click event of the update button under edit in the gridview control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.Web.UI.WebControls.GridViewUpdateEventArgs"/> instance containing the event data.</param>
protected void GridViewHolder_Updating(object sender, GridViewUpdateEventArgs e)
{
int machineid;
string machineid1;
string machineTypeid;
string machineModelid;
//retrieve and set the data
GridViewHolder.EditIndex = e.RowIndex;
BindData();
GridViewRow row = (GridViewRow)GridViewHolder.Rows[e.RowIndex];
TextBox mID = row.FindControl("MachineIDText") as TextBox;
DropDownList mType = row.FindControl("MachineTypeDropDown") as DropDownList;
DropDownList mModel = row.FindControl("MachineModelDropDown") as DropDownList;
machineid1 = mID.Text;
machineid = Convert.ToInt32(machineid1);
machineTypeid = mType.SelectedValue;
machineModelid = mModel.SelectedValue;
try
{
if (machineTypeid != "empty" || machineModelid != "empty")
{
if (machineTypeid != "empty")
{
inputsService.UpdateMachineTypes(machineid, machineTypeid);
}
if (machineModelid != "empty")
{
inputsService.UpdateMachineModels(machineid, machineModelid);
}
UpdateSucceed.Visible = true;
logger.Debug("Updating - Database successfully updated!");
}
else
{
UpdateFail.Visible = true;
logger.Debug("Updating - Database had no data selected to be updated.");
}
}
catch (Exception ex)
{
logger.ErrorFormat("Updating - Failed to update the table, ex = {0}", ex);
}
}
/// <summary>
/// Handles the Click event of the cancel button under edit in the gridview control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.Web.UI.WebControls.GridViewCancelEditEventArgs"/> instance containing the event data.</param>
protected void GridViewHolder_Canceling(object sender, GridViewCancelEditEventArgs e)
{
//reset the edit index
GridViewHolder.EditIndex = -1;
//Bind data to GridViewHolder
BindData();
}
protected void GridViewHolder_DataBound(object sender, GridViewRowEventArgs e)
{
if (this.GridViewHolder.EditIndex != -1)
{
DropDownList mType = e.Row.FindControl("MachineTypeDropDown") as DropDownList;
DropDownList mModel = e.Row.FindControl("MachineModelDropDown") as DropDownList;
}
}
protected void GridViewHolder_Editing(object sender, GridViewEditEventArgs e)
{
//set the edit index to a new value
GridViewHolder.EditIndex = e.NewEditIndex;
//Bind data to gridviewholder
BindData();
}
#endregion
#region Private Methods
private void BindData()
{
GridViewHolder.DataSource = Session["MachineTable"];
GridViewHolder.DataBind();
}
gridview markup:
<asp:GridView ID="GridViewHolder"
runat="server"
AllowPaging="True"
AutoGenerateColumns="False"
BackColor="Transparent"
BorderColor="#999999"
BorderStyle="Ridge"
BorderWidth="3px"
CellPadding="4"
CellSpacing="2"
DataSourceID="MachineDataSet"
ForeColor="Black"
HeaderStyle-HorizontalAlign="Center"
HorizontalAlign="Center"
RowStyle-HorizontalAlign="Center"
Width="796px"
OnRowUpdating="GridViewHolder_Updating"
OnRowCancelingEdit="GridViewHolder_Canceling"
OnRowEditing="GridViewHolder_Editing"
OnRowDataBound="GridViewHolder_DataBound"
EnableViewState="False">
<RowStyle BackColor="Transparent"
HorizontalAlign="Center" />
<Columns>
<asp:TemplateField HeaderText="ID"
SortExpression="ID"
Visible="False">
<ItemTemplate>
<asp:Label ID="MachineIDLabel"
runat="server"
Text='<%# Bind("ID") %>'
Visible="false"></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="MachineIDText" runat="server" Text='<%# Bind("ID") %>'></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="SiteName"
HeaderText="Site Name"
SortExpression="SiteName"
ReadOnly="true" />
<asp:BoundField DataField="Name"
HeaderText="Machine Name"
ReadOnly="true"
SortExpression="Name" />
<asp:TemplateField HeaderText="Machine Type"
SortExpression="MachineType">
<ItemTemplate>
<asp:Label ID="MachineTypeLabel"
runat="server"
Text='<%# Bind("MachineType") %>'>
</asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList ID="MachineTypeDropDown"
runat="server"
AppendDataBoundItems="True"
Height="21px"
Width="217px"
DataSourceID="GetMachineType"
DataTextField="Name"
DataValueField="ID">
<asp:ListItem Enabled="true"
Text="Select a Machine Type."
Value="empty">
</asp:ListItem>
</asp:DropDownList>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Machine Model" SortExpression="MachineModel">
<ItemTemplate>
<asp:Label ID="MachineModelLabel"
runat="server"
Text='<%# Bind("MachineModel") %>'>
</asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList ID="MachineModelDropDown"
runat="server"
AppendDataBoundItems="True"
Height="21px" Width="217px"
DataSourceID="GetMachineModel"
DataTextField="Name"
DataValueField="ID">
<asp:ListItem Enabled="true"
Text="Select a Machine Model."
Value="empty">
</asp:ListItem>
</asp:DropDownList>
</EditItemTemplate>
</asp:TemplateField>
<asp:CommandField ButtonType="Button"
ShowEditButton="True"
CausesValidation="false" >
<ItemStyle HorizontalAlign="Center"
Wrap="True" />
</asp:CommandField>
</Columns>
<FooterStyle BackColor="Transparent" />
<PagerStyle BackColor="Transparent"
ForeColor="Black"
HorizontalAlign="Left" />
<SelectedRowStyle BackColor="Transparent"
Font-Bold="True"
ForeColor="White" />
<HeaderStyle BackColor="Black"
Font-Bold="True"
ForeColor="White"
HorizontalAlign="Center" />
</asp:GridView>
any help or suggestions are greatly appreciated,
Thank you
The RowUpdating event has event-arguments of type
GridViewUpdateEventArgs. This has dictionaries for key-, old- and new-values. There is no need to get them by using FindControl on the GridViewRow.But the main reason why you are getting the old values is the fact that you are DataBinding it again in this event. Then you’re overwriting all changes with the values from your DataSource.
http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridviewupdateeventargs.aspx
Update: it seems that the
DropDownList‘sSelectedValueis not part of theNewValuesdictionary. Therefore you could add it in theRowUpdatingevent.