C# ASP Dropdownlist在GridView中时在C代码中无法识别

C# ASP Dropdownlist在GridView中时在C代码中无法识别,c#,asp.net,gridview,dropdown,C#,Asp.net,Gridview,Dropdown,我有以下问题,我不知道为什么会发生这种情况。我在网格视图中声明dropdownlist: <asp:GridView ID="grdMappingList" runat="server" OnPageIndexChanging="grdMappingList_PageIndexChanging" AutoGenerateColumns="false" AllowPaging="true" PageSize="10" ShowHeaderWhenEmpty="true" UseAcces

我有以下问题,我不知道为什么会发生这种情况。我在网格视图中声明dropdownlist:

<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:TemplateField HeaderText="Mapping Status" HeaderStyle-CssClass="width_120 aligned_center" ItemStyle-CssClass="width_120 aligned_center" Visible="true">
                                        <ItemTemplate>
                                            <asp:DropDownList id="ddgvOpp" runat="server" >
                                                <asp:ListItem Text="DONE"  Value="True"></asp:ListItem>
                                                <asp:ListItem Text="NOT DONE"  Value="False"></asp:ListItem>
                                                </asp:DropDownList>
                                        </ItemTemplate>
                                </asp:TemplateField>
                            </Columns>

以上是我的aspx代码。id为=“ddgvOpp”的dropdownlist在我的cs代码中无法识别

    private void InitializeDepartmentsDDL()
{
    List<ReplaceParameter> param = new List<ReplaceParameter>();
    //new- project selection
    param.Add(new ReplaceParameter("PROJECT_ID", Convert.ToInt32(User_Data["SelectedProj"].Rows[0]["ProjectID"].ToString())));

    DataTable AvailableDepartments = (DataTable)DQManager.Execute("LoadDepartments", null, param);
    ddgvOpp.DataSource = AvailableDepartments;
    ddgvOpp.DataTextField = "Text";
    ddgvOpp.DataValueField = "Value";
    ddgvOpp.DataBind();
    ddgvOpp.Items.Insert(0, new ListItem("Please Select...", "-1"));

}
private void InitializeDepartmentsDDL()
{
列表参数=新列表();
//新项目-项目选择
参数Add(新的替换参数(“项目ID”,Convert.ToInt32(用户数据[“SelectedProj”]。行[0][“ProjectID”]。ToString()));
DataTable AvailabledPartments=(DataTable)DQManager.Execute(“LoadDepartments”,null,参数);
ddgvOpp.DataSource=可用的部门;
ddgvOpp.DataTextField=“Text”;
ddgvOpp.DataValueField=“Value”;
ddgvOpp.DataBind();
ddgvOpp.Items.Insert(0,新列表项(“请选择…”,“-1”);
}
我得到的错误是当前上下文中不存在ename ddgvOpp。请记住,如果在gridview之外获得下拉列表,一切都正常

需要帮忙吗

解决了上述问题。现在我面临以下问题。这是我的代码:

<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>


当我调用
ddlMappingStatus\u SelectedIndexChanged
以获取特定行的所有属性时,不会返回任何内容。我无法获取特定行的值以及
DropDownList ddgvOpp=(DropDownList)grdMappingList.SelectedRow.FindControl(“ddlMappingStatus”)
给出了一个异常
null
对象

如果您想在
GridView
模板字段
中获取对控件的引用,则必须使用
GridViewRow.FindControl(“ControlID”)
,因为该行是
NamingContainer
而不是页面

if(grdMappingList.SelectedRow != null)
{
    DropDownList ddgvOpp = (DropDownList) grdMappingList.SelectedRow.FindControl("ddgvOpp");
    // ...
}
这假定您希望找到
GridView
中选定行的
DropDownList
。如果要查找所有行,必须循环行:

foreach(GridViewRow row in grdMappingList.Rows)
{
     DropDownList ddgvOpp = (DropDownList) row.FindControl("ddgvOpp");
     // ...
}

如果要获取
GridView
TemplateField
中对控件的引用,必须使用
GridView.FindControl(“ControlID”)
,因为该行是
NamingContainer
而不是页面

if(grdMappingList.SelectedRow != null)
{
    DropDownList ddgvOpp = (DropDownList) grdMappingList.SelectedRow.FindControl("ddgvOpp");
    // ...
}
这假定您希望找到
GridView
中选定行的
DropDownList
。如果要查找所有行,必须循环行:

foreach(GridViewRow row in grdMappingList.Rows)
{
     DropDownList ddgvOpp = (DropDownList) row.FindControl("ddgvOpp");
     // ...
}

现在它起作用了,但我现在面临另一个问题。dropdownlist不支持OnSelectedIndexChanged??我宣布这一点fails@apoellitsi:什么是“失败”?您必须设置
AutoPostBack
tro
true
(默认值为
false
)。也许您还在每次回发时对gridview进行数据绑定。这可以防止事件发生。如果(!IsPostBack)DataBindGrid(),请使用
检查它实际上我的错误是,我无法获取要更改下拉列表值的特定行的值。例如,我试图获取映射Id字段,并使用该grdMappingList.SelectedRow.Cells[0]文本,并且为空。即使对于此DropDownList,ddgvOpp=(DropDownList)grdMappingList.SelectedRow.FindControl(“ddlMappingStatus”);我有个例外。“对象引用未设置为对象的实例”@apoellitsi:您的aspx不包含ID为
ddlMappingStatus
的控件,为什么不使用
FindControl(“ddgvOpp”)
?现在可以了,但我现在面临另一个问题。dropdownlist不支持OnSelectedIndexChanged??我宣布这一点fails@apoellitsi:什么是“失败”?您必须设置
AutoPostBack
tro
true
(默认值为
false
)。也许您还在每次回发时对gridview进行数据绑定。这可以防止事件发生。如果(!IsPostBack)DataBindGrid(),请使用
检查它实际上我的错误是,我无法获取要更改下拉列表值的特定行的值。例如,我试图获取映射Id字段,并使用该grdMappingList.SelectedRow.Cells[0]文本,并且为空。即使对于此DropDownList,ddgvOpp=(DropDownList)grdMappingList.SelectedRow.FindControl(“ddlMappingStatus”);我有个例外。“对象引用未设置为对象的实例”@apoellitsi:aspx不包含ID为
ddlMappingStatus
的控件为什么不使用
FindControl(“ddgvOpp”)