【问题标题】:How to assign a NavigateUrl to a HyperLinkField (GridView) depending on content如何根据内容将 NavigateUrl 分配给 HyperLinkField (GridView)
【发布时间】:2013-02-15 15:45:52
【问题描述】:

我有一个带有一些 BoundFields 和一些 HyperLinkFields 的 GridView。 HyperLinkField,我想仅将 NavigateUrl 分配给其中包含文本“拒绝”的单元格。

这是我的标记:

<asp:GridView ID="gvS25ATransactions" CellSpacing="-1" GridLines="None" AutoGenerateColumns="false" OnPreRender="gvS25ATransactions_PreRender" AllowPaging="true" AllowSorting="true" PageSize="10"  runat="server">
<Columns>
    <asp:BoundField DataField="SIN" SortExpression="SIN" HeaderText="<%$ Resources:S25ATransactions, litSIN %>" />
    <asp:BoundField DataField="TRANSACTION_TYPE_DESC_EN" SortExpression="TRANSACTION_TYPE_DESC_EN" HeaderText="<%$ Resources:S25ATransactions, litType %>" />
    <asp:BoundField DataField="TRANSACTION_TYPE_DESC_FR" SortExpression="TRANSACTION_TYPE_DESC_FR" HeaderText="<%$ Resources:S25ATransactions, litType %>" />
    <asp:BoundField DataField="DATE_UPDATED" SortExpression="DATE_UPDATED" HeaderText="<%$ Resources:S25ATransactions, litDate %>" />
    <asp:BoundField DataField="USER_CODE" SortExpression="USER_CODE" HeaderText="<%$ Resources:S25ATransactions, litUser %>" />
    <asp:HyperLinkField DataTextField="STATUS_DESC_EN" SortExpression="STATUS_DESC_EN" HeaderText="<%$ Resources:S25ATransactions, litStatus %>" />
    <asp:HyperLinkField DataTextField="STATUS_DESC_FR" SortExpression="STATUS_DESC_FR" HeaderText="<%$ Resources:S25ATransactions, litStatus %>" />
</Columns>
<PagerStyle CssClass="pagination" />

这是我迄今为止尝试做的:

Protected Sub gvS25ATransactions_RowDataBound(sender As Object, e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gvS25ATransactions.RowDataBound

    If e.Row.RowType = DataControlRowType.DataRow Then

        For Each column As DataControlField In gvS25ATransactions.Columns

            If column.HeaderText = "Status" Or column.HeaderText = "Statut" Then

                For i As Integer = 0 To gvS25ATransactions.Rows.Count - 1

                    If gvS25ATransactions.Rows(i).Cells(5).Text = "Rejected by SD110" Then
                        Dim hl As HyperLink = TryCast(e.Row.FindControl("HyperLink1"), HyperLink)
                        hl.NavigateUrl = "#coucou"
                    End If

                Next

            End If

        Next

    End If

End Sub

带有“拒绝”文本的单元格将位于第 5 列或第 6 列(一个是英语,另一个是法语)。

当我执行上面的代码时,它永远不会进入这个 for 循环。

For i As Integer = 0 To gvS25ATransactions.Rows.Count - 1

它说“i”没有被声明。由于它的保护级别,它可能无法访问

帮助?

更新

这是我为 RedDevil79 的建议添加的新标记

<asp:GridView ID="gvS25ATransactions" CellSpacing="-1" GridLines="None" AutoGenerateColumns="false" OnPreRender="gvS25ATransactions_PreRender" AllowPaging="true" AllowSorting="true" PageSize="10"  runat="server">
<Columns>
    <asp:BoundField DataField="SIN" SortExpression="SIN" HeaderText="<%$ Resources:S25ATransactions, litSIN %>" />
    <asp:BoundField DataField="TRANSACTION_TYPE_DESC_EN" SortExpression="TRANSACTION_TYPE_DESC_EN" HeaderText="<%$ Resources:S25ATransactions, litType %>" />
    <asp:BoundField DataField="TRANSACTION_TYPE_DESC_FR" SortExpression="TRANSACTION_TYPE_DESC_FR" HeaderText="<%$ Resources:S25ATransactions, litType %>" />
    <asp:BoundField DataField="DATE_UPDATED" SortExpression="DATE_UPDATED" HeaderText="<%$ Resources:S25ATransactions, litDate %>" />
    <asp:BoundField DataField="USER_CODE" SortExpression="USER_CODE" HeaderText="<%$ Resources:S25ATransactions, litUser %>" />
    <asp:TemplateField  SortExpression="STATUS_DESC_EN" HeaderText="<%$ Resources:S25ATransactions, litStatus %>">
        <ItemTemplate>
            <asp:HyperLink ID="STATUS_DESC_EN" runat="server"><%# Eval("STATUS_DESC_EN")%></asp:HyperLink>
        </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField  SortExpression="STATUS_DESC_FR" HeaderText="<%$ Resources:S25ATransactions, litStatus %>">
        <ItemTemplate>
            <asp:HyperLink ID="STATUS_DESC_FR" runat="server"><%# Eval("STATUS_DESC_FR")%></asp:HyperLink>
        </ItemTemplate>
    </asp:TemplateField>       
</Columns>
<PagerStyle CssClass="pagination" />

这是VB代码

Protected Sub gvS25ATransactions_RowDataBound(sender As Object, e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gvS25ATransactions.RowDataBound

    If e.Row.RowType = DataControlRowType.DataRow Then
        Dim hl As HyperLink = TryCast(e.Row.FindControl("STATUS_DESC_EN"), HyperLink)
        Dim hl2 As HyperLink = TryCast(e.Row.FindControl("STATUS_DESC_FR"), HyperLink)
        If hl.Text = "Rejected by SD110" Or hl2.Text = "Rejeté par SD110" Then
            hl.NavigateUrl = "#coucou"
            hl2.NavigateUrl = "#coucoufr"
        End If
    End If

End Sub

我现在面临的问题是 hl.Text 和 hl2.Text 总是 ="" 所以它永远不会出现在 if 语句中

【问题讨论】:

  • gridview 中的所有文字都来自数据库。文本“拒绝”将位于 STATUS_DESC_EN 或 STATUS_DESC_FR(在本例中为“拒绝”)列中。
  • 您确定错误是指代码中的i 吗?我看不出有什么问题
  • 好吧...... i 没有错误......只是它永远不会进入循环,因为它说“'i'没有声明。由于它的保护它可能无法访问级别”
  • Rejected by SD110 这条线对所有单元格都一样吗?例如,其他单元格是否为Rejected by SD222
  • 您可以转换数据项并检查字段值,而不是访问单元格;如果你愿意,我可以给你看 C# 代码;首先,检查它是否是一个数据行:e.Row.RowType == DataControlRowType.DataRow 然后转换:var dataItem = e.Row.DataItem as &lt;your_data_item_type&gt;

标签: asp.net vb.net gridview


【解决方案1】:

试试这个:

将 GridView 中的 2 个超链接字段转换为模板并将 RowDataBound 更改为:

If e.Row.RowType = DataControlRowType.DataRow Then

    For Each column As DataControlField In gvS25ATransactions.Columns

        If column.HeaderText = "Status" Or column.HeaderText = "Statut" Then               

                If e.Row.Cells(5).Text = "Rejected by SD110" Then
                    Dim hl As HyperLink = TryCast(e.Row.FindControl("HyperLink1"), HyperLink)
                    hl.NavigateUrl = "#coucou"
                End If

        End If

    Next

End If

解释:

您必须将超链接字段转换为模板,因为您需要 FindControl 函数中的控件名称。

在 RowDataBound 中,您不需要遍历 gridview 的所有行。向 gridview 中添加数据时,将为每一行执行 RowDataBound。 这就是你不需要 for 循环的原因。

更新:

If e.Row.RowType = DataControlRowType.DataRow Then
     Dim hl As HyperLink = TryCast(e.Row.FindControl("STATUS_DESC_EN"), HyperLink)
     Dim hl2 As HyperLink = TryCast(e.Row.FindControl("STATUS_DESC_FR"), HyperLink)
     If hl.Text = "Rejected by SD110" Or hl2.Text = "Rejected by SD110" Then
         hl.NavigateUrl = "#coucou"
     End If
End If

您的超链接标签格式不正确:

<asp:GridView ID="gvS25ATransactions" CellSpacing="-1" GridLines="None" AutoGenerateColumns="false" OnPreRender="gvS25ATransactions_PreRender" AllowPaging="true" AllowSorting="true" PageSize="10"  runat="server">
    <Columns>
        <asp:BoundField DataField="SIN" SortExpression="SIN" HeaderText="<%$ Resources:S25ATransactions, litSIN %>" />
        <asp:BoundField DataField="TRANSACTION_TYPE_DESC_EN" SortExpression="TRANSACTION_TYPE_DESC_EN" HeaderText="<%$ Resources:S25ATransactions, litType %>" />
        <asp:BoundField DataField="TRANSACTION_TYPE_DESC_FR" SortExpression="TRANSACTION_TYPE_DESC_FR" HeaderText="<%$ Resources:S25ATransactions, litType %>" />
        <asp:BoundField DataField="DATE_UPDATED" SortExpression="DATE_UPDATED" HeaderText="<%$ Resources:S25ATransactions, litDate %>" />
        <asp:BoundField DataField="USER_CODE" SortExpression="USER_CODE" HeaderText="<%$ Resources:S25ATransactions, litUser %>" />
        <asp:TemplateField  SortExpression="STATUS_DESC_EN" HeaderText="<%$ Resources:S25ATransactions, litStatus %>">
            <ItemTemplate>
                <asp:HyperLink ID="STATUS_DESC_EN" runat="server" Text='<%# Eval("STATUS_DESC_EN")%>'></asp:HyperLink>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField  SortExpression="STATUS_DESC_FR" HeaderText="<%$ Resources:S25ATransactions, litStatus %>">
            <ItemTemplate>
                <asp:HyperLink ID="STATUS_DESC_FR" runat="server" Text='<%# Eval("STATUS_DESC_FR")%>'></asp:HyperLink>
            </ItemTemplate>
        </asp:TemplateField>       
    </Columns>
    <PagerStyle CssClass="pagination" />
</asp:GridView>

您必须将字段绑定到超链接的文本属性。

重要提示: Text 属性仅适用于 ' 而不是 "

【讨论】:

  • 感谢您的帮助!所以...我将我的 更改为这个 。当我逐步浏览代码时,e.Row.Cells(5).Text 始终为 =""
  • 那也没用。 hl 和 hl2 总是 ="" 我已经用新的标记更新了我的原始帖子...可以吗?
  • 没关系,改一下hl和hl2 findcontrol ID,看我的更新。
  • 嗯,是的,很明显,当我把它放在我的代码中时我改变了它哈哈......我会用代码更新原始帖子
猜你喜欢
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 2018-01-30
  • 2012-07-12
  • 1970-01-01
  • 2018-03-27
  • 2012-06-21
  • 1970-01-01
相关资源
最近更新 更多