Reputation: 261
I have a gridview with some dropdowns for updating. I want to get the new value when the user updates. I've used the method described here http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.rowupdating%28v=vs.110%29.aspx However, I'm getting this error: Unable to cast object of type 'System.Web.UI.LiteralControl' to type 'System.Web.UI.WebControls.DropDownList'. for this line of code string status = ((DropDownList)(gvr.Cells[8].Controls[0])).Text; I've tried changing the index [8] but no luck. What's wrong with this? Thanks in advance for your time and effort.
<asp:GridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" BackColor="White" BorderColor="#3366CC" BorderStyle="Solid" BorderWidth="2px" CellPadding="4" DataKeyNames="id" DataSourceID="SqlDataSource1" OnRowUpdating="GridView1_RowUpdating">
<Columns>
<asp:CommandField ShowDeleteButton="True" ShowEditButton="True" />
<asp:BoundField DataField="id" HeaderText="id" InsertVisible="False" ReadOnly="True" SortExpression="id" Visible="False" />
<asp:BoundField DataField="userName" HeaderText="User Name" ReadOnly="True" SortExpression="userName" />
<asp:BoundField DataField="employeeName" HeaderText="Employee Name" ReadOnly="True" SortExpression="employeeName" />
<asp:BoundField DataField="division" HeaderText="Division" ReadOnly="True" SortExpression="division" />
<asp:TemplateField HeaderText="Start Date" SortExpression="startDate">
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("startDate", "{0:D}") %>'></asp:TextBox>
<ajaxToolkit:CalendarExtender ID="TextBox1_CalendarExtender" runat="server" Enabled="True" TargetControlID="TextBox1" Format="D">
</ajaxToolkit:CalendarExtender>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label3" runat="server" Text='<%# Bind("startDate", "{0:D}") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="End Date" SortExpression="endDate">
<EditItemTemplate>
<asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("endDate", "{0:D}") %>'></asp:TextBox>
<ajaxToolkit:CalendarExtender ID="TextBox2_CalendarExtender" runat="server" ClearTime="True" Enabled="True" Format="D" TargetControlID="TextBox2">
</ajaxToolkit:CalendarExtender>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label4" runat="server" Text='<%# Bind("endDate", "{0:D}") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Type" SortExpression="type">
<EditItemTemplate>
<asp:DropDownList ID="DropDownList1" runat="server" SelectedValue='<%# Bind("type") %>'>
<asp:ListItem>Personal</asp:ListItem>
<asp:ListItem>Vacation</asp:ListItem>
</asp:DropDownList>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("type") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Status" SortExpression="status">
<EditItemTemplate>
<asp:DropDownList ID="DropDownList2" runat="server" SelectedValue='<%# Bind("status") %>'>
<asp:ListItem>Pending</asp:ListItem>
<asp:ListItem>Appoved</asp:ListItem>
<asp:ListItem>Declined</asp:ListItem>
</asp:DropDownList>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label2" runat="server" Text='<%# Bind("status") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<FooterStyle BackColor="#99CCCC" ForeColor="#003399" />
<HeaderStyle BackColor="#003399" Font-Bold="True" ForeColor="#CCCCFF" />
<PagerStyle BackColor="#99CCCC" ForeColor="#003399" HorizontalAlign="Left" />
<RowStyle BackColor="White" ForeColor="#003399" />
<SelectedRowStyle BackColor="#009999" Font-Bold="True" ForeColor="#CCFF99" />
<SortedAscendingCellStyle BackColor="#EDF6F6" />
<SortedAscendingHeaderStyle BackColor="#0D4AC4" />
<SortedDescendingCellStyle BackColor="#D6DFDF" />
<SortedDescendingHeaderStyle BackColor="#002876" />
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:WebPortal_Call4HealthReports_ConnectionString %>" DeleteCommand="usp_HR_TimeOffRequestsDelete" DeleteCommandType="StoredProcedure" InsertCommand="usp_HR_TimeOffRequestsInsert" InsertCommandType="StoredProcedure" SelectCommand="usp_HR_TimeOffRequestsSelectAll" SelectCommandType="StoredProcedure" UpdateCommand="usp_HR_TimeOffRequestsUpdate2" UpdateCommandType="StoredProcedure">
<DeleteParameters>
<asp:Parameter Name="id" Type="Int32" />
</DeleteParameters>
<InsertParameters>
<asp:Parameter Name="userName" Type="String" />
<asp:Parameter Name="employeeName" Type="String" />
<asp:Parameter Name="division" Type="String" />
<asp:Parameter DbType="Date" Name="startDate" />
<asp:Parameter DbType="Date" Name="endDate" />
<asp:Parameter Name="type" Type="String" />
<asp:Parameter Name="status" Type="String" />
</InsertParameters>
<UpdateParameters>
<asp:Parameter Name="id" Type="Int32" />
<asp:Parameter DbType="Date" Name="startDate" />
<asp:Parameter DbType="Date" Name="endDate" />
<asp:Parameter Name="type" Type="String" />
<asp:Parameter Name="status" Type="String" />
</UpdateParameters>
</asp:SqlDataSource>
<ajaxToolkit:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server">
</ajaxToolkit:ToolkitScriptManager>
codebehind:
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
GridViewRow gvr = (GridViewRow)GridView1.Rows[e.RowIndex];
string status = ((DropDownList)(gvr.Cells[8].Controls[0])).Text;
}
Upvotes: 0
Views: 404
Reputation: 6586
Use FindControl to find the control you're looking for instead of hardcoding an index.
DropDownList ddl = (DropDownList)gvr.FindControl("DropDownList1");
string status = ddl.Text;
Upvotes: 1