0

我有一个网格视图...

<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。任何人都可以在这里看到我缺少的东西,或者有人遇到过类似的问题吗?

更新

我确定我在这里指的不是页眉或页脚行。此外,如果我越过对象引用异常,DataSource 中的每个项目都会发生这种情况。

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

一切都很奇怪。让我知道你是否还能发现其他东西。

4

2 回答 2

0

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

希望这有所帮助!

于 2009-04-22T17:51:11.623 回答
0

当您添加 HeaderText 时,一个新的 RowType 被添加到 gridview。您需要检查引发 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;
          }
     }
}
于 2009-02-04T15:11:31.847 回答