设置HeaderText时,GridView FindControl返回null

问题描述 投票:0回答:2

我有一个GridView ...

<asp:GridView EnableViewState="true" 
                ID="grdResults" 
                runat="server" 
                CssClass="resultsGrid" 
                OnRowDataBound="grdResults_OnRowDataBound" 
                AutoGenerateColumns="false" 
                HeaderStyle-CssClass="header" 
                OnRowCommand="grdResults_OnRowCommand">
    <Columns>
       <asp:TemplateField>
           <ItemTemplate>
               <asp:Label ID="lblView" 
                           runat="server" 
                           Visible="false" 
                           Text="View">
               </asp:Label>
               <asp:HyperLink ID="hypEdit" 
                               runat="server" 
                               Visible="false" 
                               Text="(Edit)" 
                               CssClass="edit">
               </asp:HyperLink>
               <asp:LinkButton ID="btnDelete" 
                               runat="server" 
                               Visible="false" 
                               Text="(Delete)" 
                               CssClass="delete" 
                               CommandName="DeleteItem" 
                               OnClientClick="return confirm('Are you sure you want to delete?')">
               </asp:LinkButton>
               <asp:HyperLink ID="hypSelect" 
                               runat="server" 
                               Visible="false" 
                               Text="(Select)" 
                               CssClass="select">
               </asp:HyperLink>
           </ItemTemplate>
       </asp:TemplateField>
   </Columns>
</asp:GridView>

这有一个静态列,包含一个标签,两个超链接和一个链接按钮,还有一些动态生成的列......

private void SetupColumnStructure(IEnumerable<string> columnNames)
{
    var columnNumber = 0;
    foreach (var columnName in columnNames)
    {
        var templateColumn = new TemplateField
                                 {
                                     ItemTemplate = new CellTemplate(columnName)
                                 };
       grdResults.Columns.Insert(columnNumber, templateColumn);
       columnNumber++;
    }
}

作为OnRowDataBound处理程序的一部分,我检索静态列中的一个控件并在其上设置一些属性...

protected void grdResults_OnRowDataBound(object sender, GridViewRowEventArgs e)
{
    .
    .
    .
    var row = e.Row;
    var rowData = row.DataItem as Dictionary<string, object>;
    if (rowData != null)
    {
       if ((bool)rowData[displayEditLink])
       {
           var hypEdit = (HyperLink)row.FindControl("hypEdit");
           hypEdit.NavigateUrl = "~/Pages/Edit.aspx?action=Edit&objectType=" + rowData[objectTypeLiteral] + "&id=" + rowData[objectIdLiteral];
           hypEdit.Visible = true;
       }
   }
   .
   .
   .
}

这一切都正常,但没有显示列名。然后我修改了SetupColumnStructure方法,以便像这样在模板字段上设置HeaderText ...

private void SetupColumnStructure(IEnumerable<string> columnNames)
{
    var columnNumber = 0;
    foreach (var columnName in columnNames)
    {
        var templateColumn = new TemplateField
                                 {
                                     ItemTemplate = new CellTemplate(columnName),
                                     HeaderText = columnName
                                };
       grdResults.Columns.Insert(columnNumber, templateColumn);
       columnNumber++;
    }
}

由于某种原因,这一个额外的行更改导致row.FindControl(“hypEdit”);在OnRowDataBound处理程序中调用以返回null。任何人都可以看到我在这里丢失的东西,或者有没有人遇到过类似的问题?

UPDATE

我已经确定我在这里没有引用页眉或页脚行。此外,如果我跳过对象引用异常,则会对DataSource中的每个项发生这种情况。

不确定这是否有帮助,但正如我所料,当我逐步完成代码时,表生成了所有预期的列但是所有单元格(DataControlFieldCells)在设置HeaderText时都不包含任何控件,而是在未设置时所有预期的控件。

一切都很奇怪。如果你能发现任何其他信息,请告诉我。

asp.net gridview binding findcontrol headertext
2个回答
0
投票

添加HeaderText时,会在gridview中添加新的RowType。您需要检查引发OnRowDataBound事件的行类型并采取适当的操作。在您的情况下,只检查e.Row.RowType是否是DataRow应该可以解决您的问题:

protected void grdResults_OnRowDataBound(object sender, GridViewRowEventArgs e)
{
     if(e.Row.RowType == DataControlRowType.DataRow)
     {
          if ((bool)rowData[displayEditLink])
          {
           var hypEdit = (HyperLink)row.FindControl("hypEdit");
           hypEdit.NavigateUrl = "~/Pages/Edit.aspx?action=Edit&objectType=" + rowData[objectTypeLiteral] + "&id=" + rowData[objectIdLiteral];
           hypEdit.Visible = true;
          }
     }
}

0
投票

这是因为您要搜索的控件包含在另一个控件中。 FindControl()不查看控件的控件集合。您将需要编写recursiveFindControl()方法。

希望这有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.