如何在 asp.net 的 gridview 中启用和禁用按钮

How to enable and disable buttons in a gridview in asp.net

我目前有一个带有两个按钮的 GridView,我使用以下代码添加了这些按钮;

<asp:GridView ID="gvResults" AutoGenerateColumns="False" runat="server" Font-Size="small"
        DataKeyNames="BeachHutID" OnRowDataBound="gvResults_RowDataBound" CssClass="BBCSearch">
        <Columns>
            <asp:BoundField DataField="BeachHutID" SortExpression="BeachHutID" Visible="false">
            </asp:BoundField>
            <asp:ImageField DataImageUrlField="HutImage" ItemStyle-Width="1%" ReadOnly="true" />
            <asp:BoundField HeaderText="Facilities" DataField="Facilities" Visible="false"></asp:BoundField>
            <asp:BoundField HeaderText="Info" DataField="Info" Visible="false"></asp:BoundField>
            <asp:TemplateField>
                <ItemTemplate>
                    <asp:PlaceHolder ID="lblHolder" runat="server"></asp:PlaceHolder>
                    <br />
                    <asp:PlaceHolder ID="imgHolder" runat="server"></asp:PlaceHolder>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField>
                <ItemTemplate>
                    <asp:Button ID="btnHire" CommandArgument='<%# Eval("BeachHutID") %>' runat="server"
                        Text="Hire Beach Hut" OnClick="Hire_Click" />
                        <asp:Button ID="ButtonLogin" CommandArgument='<%# Eval("BeachHutID") %>' runat="server"
                        Text="Login to Hire Beach Hut" OnClick="Login_Redirect" />
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>

我想要发生的是,如果用户已登录,则应启用并显示 btnHire 按钮;如果他们未登录,则显示 ButtonLoggedIn 并隐藏 btnHire。这是我目前的代码;

Public Sub PopulateGrid()


    Dim AvailableHuts As New DataTable


    AvailableHuts = GetData()


    gvResults.DataSource = AvailableHuts
    gvResults.DataBind()
    gvResults.Enabled = True

    'If statement controlling the enabling and disabling of the Beach Hut booking button

    If Session("LoginID") = "" Then
        For Each rowItem As GridViewRow In gvResults.Rows
            rowItem.Cells(5).Enabled = True
        Next
    End If

    lblCaption.Text = "Your search returned " + CStr(AvailableHuts.Rows.Count) + " results"

End Sub

目前这两个按钮始终处于启用状态,我不确定我需要 add/changed 什么才能获得所需的结果。

根据@Andrei 发布的答案,我已将以下内容添加到此 Sub;

Protected Sub gvResults_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs) Handles gvResults.RowDataBound
    Dim URL(), Text() As String
    Dim img As Image
    Dim lbl As Label
    Dim FacilitiesImg As PlaceHolder = e.Row.FindControl("imgHolder")
    Dim Infolbl As PlaceHolder = e.Row.FindControl("lblHolder")

     'Added Code from answer
    Dim hireBtn As Button = CType(e.Row.FindControl("btnHire"), Button)
    hireBtn.Visible = Not String.IsNullOrEmpty(Session("LoginID"))

     'Added Code from answer
    Dim LoginBtn As Button = CType(e.Row.FindControl("ButtonLogin"), Button)
    LoginBtn.Visible = String.IsNullOrEmpty(Session("LoginID"))

    If e.Row.RowType = DataControlRowType.DataRow Then

        URL = e.Row.DataItem(3).Split(",")
        Text = e.Row.DataItem(2).Split(",")

        'Add the Facilities Images to the grid Row
        For Each item In URL
            If item.ToString <> "" Then
                img = New Image
                img.ImageUrl = item.ToString
                FacilitiesImg.Controls.Add(img)
            End If
        Next

        'Add the information to the grid row
        'convert # into a carriage return and * into £
        For Each item In Text
            If item.ToString <> "" Then
                lbl = New Label
                lbl.Text = Replace(Replace(item.ToString, "#", "<br />"), "*", "&pound;")
                Infolbl.Controls.Add(lbl)
            End If
        Next

    End If



End Sub

但是我在尝试 运行 程序时收到以下错误;

Cannot refer to an instance member of a class from within a shared method or shared member initializer without an explicit instance of the class

如有任何帮助,我们将不胜感激。

谢谢

不确定您的身份验证是如何实施的,但我们假设您使用 HttpContext.Current.Request.IsAuthenticated。然后你可以在后面的代码中操作 Visible 属性 按钮:

btnHire.Visible = HttpContext.Current.Request.IsAuthenticated
ButtonLoggedIn.Visible = Not HttpContext.Current.Request.IsAuthenticated

更新。 抱歉,post 不知何故错过了您似乎正在使用 Session("LoginID") 来决定用户是否已登录的事实。您可以这样做:

btnHire.Visible = Not String.IsNullOrEmpty(Session("LoginID"))
ButtonLoggedIn.Visible = String.IsNullOrEmpty(Session("LoginID"))

更新 2. 事实证明,按钮是 GridView 行的一部分。由于它们在模板内部,您无法在后面的代码中真正访问到它们。所以你可以有两个选择。

首先,您可以订阅 RowDataBound 事件(您已经这样做了),然后在其中在当前行中执行 FindControl 以找到必要的按钮:

Sub gvResults_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs)
    ...
    Button hireBtn = CType(e.Row.FindControl("btnHire"), Button);
    hireBtn.Visible = Not String.IsNullOrEmpty(Session("LoginID"))

第二个按钮也是如此。

其次,您可以尝试在标记中这样做:

<asp:Button ID="btnHire" CommandArgument='<%# Eval("BeachHutID") %>'
            runat="server" Text="Hire Beach Hut" OnClick="Hire_Click" 
            Visible=<%# String.IsNullOrEmpty(Session("LoginID")) %> />

尝试

<asp:Button ID="btnHire" CommandArgument='<%# Eval("BeachHutID") %>' runat="server" Visible='<%# islogin()?true:false %>' Text="Hire Beach Hut" OnClick="Hire_Click" />

<asp:Button ID="ButtonLoggedIn" CommandArgument='<%# Eval("BeachHutID") %>' runat="server" Visible='<%# islogin()?false:true %>' Text="Login to Hire Beach Hut" OnClick="Login_Redirect" />

将此代码粘贴到 aspx.cs 页面:

Public Shared Function isLogin() As Boolean
    Dim stat As Boolean = False
    Try
        If Session("LoginID") IsNot Nothing AndAlso Session("LoginID") <> "" Then
            stat = True
        End If
    Catch e1 As Exception
        stat = False
    End Try
    Return stat
End Function

编辑2:

Visible='<%# islogin()?false:true %> 这意味着如果 isLogin() return true 那么 Visible 属性 设置为 false 否则它是 visible 属性 设置为 true.