C# 通过更改DropDownList中的值从GridView检索值
通过更改行中DropDownList的状态检索当前行时遇到问题。我的GridView代码是:C# 通过更改DropDownList中的值从GridView检索值,c#,asp.net,gridview,drop-down-menu,C#,Asp.net,Gridview,Drop Down Menu,通过更改行中DropDownList的状态检索当前行时遇到问题。我的GridView代码是: <asp:GridView ID="grdMappingList" runat="server" OnPageIndexChanging="grdMappingList_PageIndexChanging" AutoGenerateColumns="false" AllowPaging="true" PageSize="10" ShowHeaderWhenEmpty="true" UseAcc
<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>
我在这行上遇到一个错误:
DropDownList ddgvOpp (DropDownList)grdMappingList.SelectedRow.FindControl("ddlMappingStatus");
int MappingID = Convert.ToInt16(grdMappingList.SelectedRow.Cells[0].Text);
这一行:
DropDownList ddgvOpp (DropDownList)grdMappingList.SelectedRow.FindControl("ddlMappingStatus");
int MappingID = Convert.ToInt16(grdMappingList.SelectedRow.Cells[0].Text);
似乎我无法检索这些值!我不知道为什么。当我从DropDownList中选择一个新状态时,我希望获得该行的所有值,以便更新记录
不幸的是,
SelectedRow
并不是你所认为的意思。它不仅仅是指您正在处理的当前行或当前行以及您正在使用的控件。必须以某种方式设置该属性。这通常通过GridView上的“选择”按钮完成,例如命令名为“选择”的
然而,你真的不需要这个。您只需要与您一起工作的行。由于您正在使用DropDownList的SelectedIndexChanged
事件,因此您已经拥有了所需的内容。你只需要换一种方式
首先,获取下拉列表。然后获取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中使用
控件时,获取它们的值不是很干净。您必须像以前那样对列索引进行硬编码:
GridViewRow row = (GridViewRow)ddlMappingStatus.NamingContainer;
String mappingID = row.Cells[0].Text;
我倾向于使用
控件,这样我就可以使用FindControl()
来获得我想要的东西。这可以防止列的任何重新排序破坏代码,因为您必须硬编码不同的索引。例如,要查找DropDownList(因为它已经是
),您可以执行以下操作:
DropDownList ddlMappingStatus = (DropDownList)row.FindControl("ddlMappingStatus");
当您在
ddlMappingStatus\u SlectedIndexChanged
事件中放置断点时,它是否会命中该代码。。?还有,您得到的错误是什么。。?你试过将控件包装在UpdatePanel上吗?您好,是的,它击中了代码我得到的错误是“{”对象引用未设置为对象的实例。“}”你是说用UpdatePanel包装dropdownlist吗?因为我正在用更新面板包装整个gridView,所以您的代码没有显示这一点..我只添加了gridView的代码..谢谢您解释得很好的答案。实际上,我需要该行,因为我需要BoundField=“Mapping Id”的值。如何获取该字段的特定值?我已经了解了如何获取dropdownlist的值,是的,它可以工作。但我无法得到特定字段的值。我认为您关于templateField的建议是正确的。我正在尝试获取字符串entityID=row.Cells[2].Text的值;我得到的是空字符串。我想这是因为该字段不可见?您建议我用templateField包装每个boundfield?正确,您将无法获取不可见字段的值。查看此以了解更多关于此的信息。我建议用TemplateFields替换您的BoundFields,因为我发现使用它们更容易、更干净。但最终的决定取决于你。