我在通过更改行中DropDownList的状态来检索当前行时遇到问题。我的GridView代码是:
<asp:GridView ID="grdMappingList" runat="server" OnPageIndexChanging="grdMappingList_PageIndexChanging" AutoGenerateColumns="false" AllowPaging="true" PageSize="10" ShowHeaderWhenEmpty="true" UseAccessibleHeader="true" CssClass="table table-hover table-striped segment_list_tbl" >
<PagerStyle CssClass="grid_pagination" HorizontalAlign="Right" VerticalAlign="Middle" BackColor="#DFDFDF" />
<Columns>
<asp:BoundField HeaderText="Mapping Id" DataField="MAPPING_ID"></asp:BoundField>
<asp:BoundField HeaderText="PDM Name" DataField="PDM_NAME"></asp:BoundField>
<asp:BoundField HeaderText="PDM EntityID" DataField="PDM_ENTITY_ID" Visible="false"></asp:BoundField>
<asp:TemplateField HeaderText="Mapping Status" HeaderStyle-CssClass="width_120 aligned_center" ItemStyle-CssClass="width_120 aligned_center" Visible="true">
<ItemTemplate>
<asp:DropDownList id="ddlMappingStatus" runat="server" SelectedValue='<%# Bind("MappingCompleted") %>' OnSelectedIndexChanged="ddlMappingStatus_SelectedIndexChanged" AutoPostBack="true">
<asp:ListItem Text="Done" Value="DONE"></asp:ListItem>
<asp:ListItem Text="Not Done" Value="NOT DONE"></asp:ListItem>
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
背后的代码是:
protected void ddlMappingStatus_SelectedIndexChanged(object sender, EventArgs e)
{
int MappingID = Convert.ToInt16(grdMappingList.SelectedRow.Cells[0].Text);
DropDownList ddgvOpp = (DropDownList)grdMappingList.SelectedRow.FindControl("ddlMappingStatus");
if (ddgvOpp.Equals("DONE"))
{
}
}
我在这一行收到错误:
DropDownList ddgvOpp (DropDownList)grdMappingList.SelectedRow.FindControl("ddlMappingStatus");
和这一行:
int MappingID = Convert.ToInt16(grdMappingList.SelectedRow.Cells[0].Text);
似乎我无法检索这些值!我不知道为什么。当我从DropDownList中选择一个新状态时,我想获取该行的所有值以便更新记录。
答案 0 :(得分:2)
不幸的是,SelectedRow
并不代表您认为的含义。它不仅仅意味着您正在处理的当前行或具有您正在使用的控件的当前行。该属性必须以某种方式设置。这通常通过GridView上的“选择”按钮完成,例如<asp:ButtonField>
,命令名称为“选择”。
但你确实不需要这个。你只需要你正在使用的行。由于您使用的是DropDownList的SelectedIndexChanged
事件,因此您已经拥有了所需的内容。你只需要以不同的方式去做。
首先,获取DropDownList。然后获取DropDownList的行。现在用行做你需要的任何事情。
但是,从您的代码来看,您可能甚至不需要该行。您只需要DropDownList的值。所以你可以一起跳过这一切。但如果你确实需要这一行,那么你也可以这样做。
protected void ddlMappingStatus_SelectedIndexChanged(object sender, EventArgs e)
{
DropDownList ddlMappingStatus = (DropDownList)sender;
if(ddlMappingStatus.SelectedItem.Text.ToUpper() == "DONE")
{
}
GridViewRow row = (GridViewRow)ddlMappingStatus.NamingContainer;
}
现在,当你在GridView中使用<asp:BoundField>
控件时,获取它们的值并不是很干净。您不得不像以前一样对列索引进行硬编码:
GridViewRow row = (GridViewRow)ddlMappingStatus.NamingContainer;
String mappingID = row.Cells[0].Text;
我倾向于使用<asp:TemplateField>
控件,因此我可以使用FindControl()
来获取我所追求的内容。这可以防止任何列的重新排序破坏代码,因为您必须对不同的索引进行硬编码。例如,要找到DropDownList(因为它已经是<asp:TemplateField>
),你可以这样做:
DropDownList ddlMappingStatus = (DropDownList)row.FindControl("ddlMappingStatus");