C# Can';t从GridView标题行访问DropDownList控件
我对GridView标题有问题。我无法从标题访问下拉控件,即使有一个。这就是我的网格看起来的样子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"
<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
,它会自动触发。