我有一个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。任何人都可以看到此处遗漏的内容或者有任何人遇到过类似的问题吗?
更新
我已经确定我在这里没有引用页眉或页脚行。此外,如果我跳过对象引用异常,则会对DataSource中的每个项发生这种情况。
不确定这是否有帮助,但正如我所料,当我逐步完成代码时,表生成了所有预期的列但所有单元格(DataControlFieldCells)在设置HeaderText时不包含任何控件,但是当它不是时所有预期的控件集。
一切都很奇怪。如果你能发现其他任何事情,请告诉我。
答案 0 :(得分: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;
}
}
}
答案 1 :(得分:0)
因为你要搜索的控件包含在另一个控件中。 FindControl()不查看控件的控件集合。您需要编写一个recursiveFindControl()方法。
希望这有点帮助!