我在通过更改行中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选择一个新状态时,我想获取该行的所有值以更新记录。
最佳答案
不幸的是,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");
关于c# - 通过更改DropDownList中的值从GridView检索值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35416470/