C# Can';t从GridView标题行访问DropDownList控件

C# Can';t从GridView标题行访问DropDownList控件,c#,asp.net,gridview,C#,Asp.net,Gridview,我对GridView标题有问题。我无法从标题访问下拉控件,即使有一个。这就是我的网格看起来的样子 <asp:GridView runat="server" ID="AcceptedRecordsGridview" AutoGenerateColumns="false" DataKeyNames="idn" CssClass="table"

我对GridView标题有问题。我无法从标题访问下拉控件,即使有一个。这就是我的网格看起来的样子

<asp:GridView runat="server" 
               ID="AcceptedRecordsGridview"
               AutoGenerateColumns="false"
               DataKeyNames="idn" 
               CssClass="table" 
               GridLines="none"
               AllowPaging="true" 
               OnPageIndexChanging="OnPaging" 
               AllowSorting="true"
               PageSize="4" >
    <Columns>
        <asp:TemplateField HeaderText="ID" SortExpression="idn">
            <ItemTemplate>
                <asp:Label ID="Label2" runat="server" Text='<%# Bind("idn") %>'>
                </asp:Label>
            </ItemTemplate>
            <EditItemTemplate>
                <asp:Label ID="Label1" runat="server" Text='<%# Eval("idn") %>'>
                </asp:Label>
            </EditItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Message info" SortExpression="ninfo">
            <ItemTemplate>
                <asp:Label ID="Label1" runat="server" Text='<%# Bind("ninfo") %>'>
                </asp:Label>
            </ItemTemplate>
            <EditItemTemplate>
                <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("ninfo") %>'>
                </asp:TextBox>
            </EditItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Unit ID" SortExpression="idb">
            <ItemTemplate>
                <asp:Label ID="Label2" runat="server" Text='<%# Bind("idb") %>'>
                </asp:Label>
           </ItemTemplate>
           <EditItemTemplate>
               <asp:Label ID="Label1" runat="server" Text='<%# Eval("idb") %>'>
               </asp:Label>
           </EditItemTemplate>
       </asp:TemplateField>
       <asp:TemplateField>
           <HeaderTemplate>
               Status:
               <asp:DropDownList ID="ddlStatus"
                                 runat="server"
                                 OnSelectedIndexChanged = "StatusChanged" 
                                 AutoPostBack = "true"
                                 AppendDataBoundItems = "true" >
                   <asp:ListItem Text = "ALL" Value = "ALL">      
                   </asp:ListItem>
                   <asp:ListItem Text = "Top 10" Value = "10">
                   </asp:ListItem>
               </asp:DropDownList>
           </HeaderTemplate>
           <ItemTemplate>
               <asp:Label ID="Label2" runat="server" Text='<%# Bind("status") %>'>
               </asp:Label>
           </ItemTemplate>
           <EditItemTemplate>
               <asp:Label ID="Label1" runat="server" Text='<%# Eval("status") %>'>
               </asp:Label>
           </EditItemTemplate>
       </asp:TemplateField>
       <asp:TemplateField HeaderText="Received" SortExpression="time">
           <ItemTemplate>
               <asp:Label ID="Label2" runat="server" Text='<%# Bind("time") %>'>
               </asp:Label>
           </ItemTemplate>
           <EditItemTemplate>
               <asp:Label ID="Label1" runat="server" Text='<%# Eval("time") %>'>
               </asp:Label>
           </EditItemTemplate>
       </asp:TemplateField>
       <asp:TemplateField HeaderText="Solved" SortExpression="timeUpdated">
           <ItemTemplate>
               <asp:Label ID="Label2" runat="server" Text='<%# Bind("timeUpdated") %>'>
               </asp:Label>
           </ItemTemplate>
           <EditItemTemplate>
               <asp:Label ID="Label1" runat="server" Text='<%# Eval("timeUpdated") %>'>
               </asp:Label>
           </EditItemTemplate>
       </asp:TemplateField>
   </Columns>
</asp:GridView>

地位:
我想从HeaderTeamplate标签访问下拉控件。我尝试了不同的解决方案,比如这个
dropdownlistddlstatus=(DropDownList)AcceptedRecordsGridview.HeaderRow.FindControl(“ddlStatus”)
此外,我还尝试使用RowDataBound获取控件,并尝试使用foreach语句循环行,但每次都会出现空引用异常。有人能告诉我我做错了什么吗?事先非常感谢。

试试这个

foreach (GridViewRow gr in AcceptedRecordsGridview.Rows)
{ 
  if (gr.RowType == DataControlRowType.Header)
  {
   DropDownList drop = gr.FindControl("DropDownList1") as DropDownList; 
  }

}

foreach
方法不起作用,因为
GridView.Rows
从不返回页眉或页脚,而只返回当前的行

因此,您必须使用
RowDataBound
,它是在网格为每一行(包括页眉和页脚)绑定数据之后调用的。因此有必要检查
行类型

protected void AcceptedRecordsGridview_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.Header)
    {
        DropDownList ddlStatus = (DropDownList) e.Row.FindControl("ddlStatus");
    }
}

显示RowDataBound或Foreach Codeforeach(AcceptedRecordsGridview.Rows中的GridViewRow gr){DropDownList drop=gr.FindControl(“DropDownList 1”)作为DropDownList;}这就是我的for each语句的样子,
foreach
不起作用,因为在
GridView.Rows.GetEnumerator
中省略了标题行。但是看到
RowDataBound
方法会很有趣。您什么时候试图找到控件?在加载网格之前还是之后?这是在我加载网格并用MySqlI的数据填充它之后。我也尝试了这个,但不知道为什么它没有进入循环。我在外观中使用了一个断点来检查它是否运行,但显然它是跳过的。这个断点是在网格填充数据后自动触发的,还是我需要在需要它的地方触发的?@MoMo:调用
AcceptedRecordsGridview.DataBind()时,每行都会触发它
在分配了
数据源之后。或者,如果您使用
ObjectDataSource
SqlDataSource
,它会自动触发。