JPM
JPM

Reputation: 189

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

I currently have a GridView with two buttons that I have added using the following code;

<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>

What I want to happen is if the user is logged in, the btnHire button should be enabled and showing and if they're not logged in, ButtonLoggedIn is showing and btnHire is hidden. This is the code I have at the moment;

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

At the moment both buttons are enabled at all times and I'm not sure what I need to add/changed to get the desired result.

From the answer posted by @Andrei, I have added the following to to this 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

However I'm receiving the following error when trying to run the program;

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

Any assistance would be much appreciated.

Thanks

Upvotes: 0

Views: 5834

Answers (2)

A_Sk
A_Sk

Reputation: 4630

try

<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" />

paste this code to aspx.cs page:

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

Edit2:

Visible='<%# islogin()?false:true %> this means if isLogin() return true then Visible property set to false else it's visible property set to true.

Upvotes: 0

Andrei
Andrei

Reputation: 56688

Not sure how is your authentication implemented, but let's assume you use HttpContext.Current.Request.IsAuthenticated. Then you can just manipulate Visible property of the buttons in code behind:

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

Update. Sorry, somehow missed from the post the fact that you seems to be using Session("LoginID") to decide if the use is logged in. The you can do this:

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

Update 2. As it turns out, buttons are a part of GridView row. As they are inside the template, you cannot really reach them in the code behind. So you can take two options.

First, you can subscribe to RowDataBound event (which you already did), and inside it do FindControl in the current row to find the necessary button:

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"))

and likewise for the second button.

Second, you can try doing it in the markup:

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

Upvotes: 1

Related Questions