我在通过更改行中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选择一个新状态时,我想获取该行的所有值以更新记录。

c# - 通过更改DropDownList中的值从GridView检索值-LMLPHP

最佳答案

不幸的是,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/

10-12 05:44