问题:
我想在网格视图数据绑定的中间添加标题。我更新了数据表以包含标题及其正确位置(我在调试期间检查过,它们在那里)。在包含标题的新行上,其中一个不需要的字段(不需要,因为标题中不需要该信息)中有一个名为"Subheader"的标志。
背景资料:
因此,我的数据表行包含服务器名称和服务器所属的组。我更新了数据表,使其插入一个新行,其中服务器名称是标题文本。此新行所属的服务器组是"子标题"。我的数据表包含的信息比网格视图显示的信息多。我的网格视图只需要一列,但有一列包含visibility=false;
,用于保存服务器组。
我想要实现的目标:
因此,当我将此数据表绑定到 gridview 时,我希望所有非标题行都是指向另一个位置的链接。所有作为标题的数据行我只想保持原样。
法典:
private void CurrentServers_RowCreated(Object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
if(e.Row.Cells[1].Text != "Subheader")
{
e.Row.Cells[0].Text = "<a href='/EventViewer.aspx?m=" + e.Row.Cells[0].Text + "&s=&e=Application&r=25'>" + e.Row.Cells[0].Text + "</a>";
}
}
}
问题:
这是行不通的。 e.Row.Cells[1].Text != "Subheader"
始终返回 true。在调试中,我检查e.Row.Cells[1].Text
的值,并在其中的某个地方包含我需要的信息。
- 这是我应该处理的正确事件吗?
- 如何访问这些数据?
e.Row.Cells[1].Text
和e.Row.Cells[1].ToString()
不会返回我想要的结果,即使在调试中我也可以在e.Row
中找到我想要的值 - 我试图准确找到它是如何工作的,但无法找到答案。如果我的 GridView 只有 2 个数据表列的列,
e.Row.Cells
只有我的网格视图所需的 2 个单元格,还是在它分解数据表之前发生这种情况(即它是否具有我的数据表具有的所有列)
根据绑定数据的方式和获取服务器组的方式,可以执行以下操作:
在显示非标题行内容的项模板中,使用两个占位符而不是纯文本,一个占位符保存非超链接文本的标签,另一个占位符保存超链接。将这两个控件绑定到使用的任何文本属性。并将这些占位符的可见性设置为 Eval("ServerGroup").ToString().ToLowerInvariant().Equals("subheader")
和 !Eval("ServerGroup").ToString().ToLowerInvariant().Equals("subheader")
.这样,您就不必编写代码来执行控件操作,也不必一起使用 RowDataBound 事件。
如果这没有意义,请告诉我:)
编辑:
<asp:GridView ID=".." runat="server" ...>
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:PlaceHolder id="phTextContent" runat="server" visible='<%# Eval("ServerGroup").ToString().ToLowerInvariant().Equals("subheader") %>'>
<asp:Label id="lblServerGroup" runat="server" text='<%#Eval("ServerGroup")%>'/>
</asp:PlaceHolder>
<asp:PlaceHolder id="phTextContent" runat="server" visible='<%# !Eval("ServerGroup").ToString().ToLowerInvariant().Equals("subheader") %>'>
<asp:HyperLink id="hlServerGroup" runat="server" Text='<%#Eval("ServerGroup")%>' NavigateUrl='<%#string.Fromat("/MyAction.aspx?param=", Eval("Param"))%>'/>
</asp:PlaceHolder>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>