我的 ASP.NET 页面上有一个数据绑定中继器。我正在使用转发器来构建一个元素列表,每个元素都包含一个文本(由数据绑定表中的一列给出),该文本可能超链接到另一个页面。是否应包含超链接由数据绑定表中的另一列确定。
我不知道如何解决这个问题。我应该使用根据第二列中的值显示或隐藏的 HyperLink 服务器控件吗?然后如何更改转发器中每个项目的此控件的 Visible 属性?有更好的方法吗?
谢谢。
我的 ASP.NET 页面上有一个数据绑定中继器。我正在使用转发器来构建一个元素列表,每个元素都包含一个文本(由数据绑定表中的一列给出),该文本可能超链接到另一个页面。是否应包含超链接由数据绑定表中的另一列确定。
我不知道如何解决这个问题。我应该使用根据第二列中的值显示或隐藏的 HyperLink 服务器控件吗?然后如何更改转发器中每个项目的此控件的 Visible 属性?有更好的方法吗?
谢谢。
1 最火的方法
是的,您将 asp:label 和 asp:hyerlink 添加到模板中,在 ItemDataBound 上,您可以访问您的数据,并调整超链接和标签的可见性。
2 秒方法(快速)
Visible
或根据Eval.DataBinder
c# 表达式调整您的属性
对于您的超链接(只是示例)
Visible='<%#
CustomFunction((object)DataBinder.Eval(Container.DataItem, "YourColumn")).ToString()
%>'
您可以有两个控件。一个是超链接,一个是常规标签或文字。然后,在ItemDataBound事件中,根据第二列的值显示/隐藏相应的控件。请参阅下面的示例代码。您显然需要更改它以适应您的情况。
Private Sub Repeater_ItemDataBound(ByVal sender As Object, Byval e As RepeaterItemEventArgs)
If (e.Item.ItemType Is ListItemType.Item) Or (e.Item.ItemType Is ListItemType.AlternatingItem) Then
Dim hyperlink = CType(e.Item.FindControl("HyperLink1"), HyperLink)
Dim label = CType(e.Item.FindControl("Label1"), Label)
Dim dataSource = CType(e.Item.DataItem, MyDataSourceObject)
If (dataSource.HyperLink = String.Empty) Then
hyperlink.visible = false
Else
label.visible = false
hyperlink.NavigateUrl = dataSource.HyperLink
End If
End If
End Sub
您可以像这样在转发器中设置可见属性:
<asp:HyperLink ID="lnk" runat="server" Visible='<%# Boolean.Parse(Eval("IsVisible").ToString()) %>' />
试试这个:
void Repeater1_ItemDataBound(Object Sender, RepeaterItemEventArgs e) {
// Execute the following logic for Items and Alternating Items.
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) {
DataRowView row = e.Item.DataItem as DataRowView;
if (row["ColumnName2"] == "Something") {
((HyperLink)e.Item.FindControl("HyperLink1")).NavigateUrl= row["ColumnName1"];
}
else
{
((HyperLink)e.Item.FindControl("HyperLink1")).Visible = False;
}
}
}
使用Repeater ItemDataBound 命令..
void repeater_ItemDataBound(Object Sender, RepeaterItemEventArgs e)
{
DataRowView row = (DataRowView)e.Item.DataItem;
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType ==ListItemType.AlternatingItem)
{
if(row["othercolumnName"].ToString()==true)//You can check the value here..use your logic
{
LinkButton lnk=(LinkButton)e.Item.FindControl("lnkID");
lnk.Visible=False;
}
}
}
我更喜欢在标记中做这种简单的事情,因为它更容易测试、修改和适应未来的变化。
这是一个如何做到这一点的示例 - 假设我正在绑定到具有 a Name
、 aShouldWeCreateLink
和一个Address
属性的对象集合:
<ItemTemplate>
<tr>
<td>
<%--Bind to Name Property--%>
<%# Eval("Name") %>
</td>
<%--Should we show a hyperlink or a simple text with the address?--%>
<td>
<%# Eval("ShouldWeCreateLink").ToString() == "True" ? string.Format("<a href=\"Link.aspx?ID={0}\">{1}</a>", Eval("ID"),"Click me") : Eval("Address")%>
</td>
</tr>
</ItemTemplate>
当需要创建超链接时,上面会生成这样的超链接:
<a href="link.aspx?ID=9">Click me</a>
尽可能避免使用服务器控件,除非您需要ViewState
或以编程方式从代码隐藏中访问它们的属性。