Miky-Bet
Miky-Bet

Reputation: 355

Conditional render on a gridview

I have this GridView:

<asp:GridView CssClass="table table-hover mt-5" ID="OrderTable" runat="server" AutoGenerateColumns="False" DataKeyNames="Identificativo" DataSourceID="DBGestioneOrdini" OnPreRender="GridView_PreRender">
   <Columns>
      <asp:BoundField DataField="Identificativo" HeaderText="Identificativo" InsertVisible="False" ReadOnly="True" SortExpression="Identificativo" />
      
      <asp:TemplateField  HeaderText="Genera Fattura" HeaderStyle-CssClass="text-center" ItemStyle-VerticalAlign="Middle" ItemStyle-HorizontalAlign="Center">
         <ItemTemplate>
            <asp:LinkButton type="button" ID="generateInvoiace" runat="server" OnClick="generateInvoiace_Click" ForeColor="Black" CommandName="SelectRow" CommandArgument='<%# Eval("Identificativo") %>'>  
               <i  class="fa-solid fa-file-invoice-dollar fa-lg>
               </i>
            </asp:LinkButton>
         </ItemTemplate>
      </asp:TemplateField>
   </Columns>
</asp:GridView>

It takes the data from an Order Table. The problem here is that I need to disable the clickable icon for every record which have a specific value on a field of the db ... I can't actually realize how can i modify only certain icons since the table is rendered by asp.net and not manually

Upvotes: 0

Views: 654

Answers (1)

Albert D. Kallal
Albert D. Kallal

Reputation: 49039

Ok, so say we have this grid view:

    <asp:GridView ID="GHotels" runat="server" AutoGenerateColumns="False" 
            DataKeyNames="ID" CssClass="table">
            <Columns>
                <asp:BoundField DataField="FirstName" HeaderText="FirstName"  />
                <asp:BoundField DataField="LastName" HeaderText="LastName"    />
                <asp:BoundField DataField="HotelName" HeaderText="HotelName"  />
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:CheckBox ID="chkActive" runat="server" Checked='<%# Eval("Active") %>' />
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Hotel Information" ItemStyle-HorizontalAlign="Center">
                    <ItemTemplate>
                        <asp:Button ID="cmdView" runat="server" Text="Info" CssClass="btn" 
                            OnClick="cmdView_Click" />
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>

And our code to load the grid view could be this:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not IsPostBack Then
        LoadGrid
    End If
End Sub

Sub LoadGrid()

    Dim rstData As DataTable
    rstData = MyRst("SELECT * FROM tblHotelsA ORDER BY HotelName")
    GHotels.DataSource = rstData
    GHotels.DataBind()

End Sub

Public Function MyRst(strSQL As String) As DataTable
    Dim rstData As New DataTable
    Using conn As New SqlConnection(My.Settings.TEST4)
        Using cmdSQL As New SqlCommand(strSQL, conn)
            conn.Open()
            rstData.Load(cmdSQL.ExecuteReader)
            rstData.TableName = strSQL
        End Using
    End Using
    Return rstData
End Function

So no loops, just send a data table to the grid, and we now have this:

enter image description here

However, lets say we ONLY want the info button to show for when the hotel is active.

so, for things like totals, time formatting, color formatting, or whatever?

You use the row data bound event.

So, we can add to above this event that will "hide" the info button for any row in which the hotel is not active.

So, this code:

Protected Sub GHotels_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles GHotels.RowDataBound

    If e.Row.RowType = DataControlRowType.DataRow Then

        Dim chkActive As CheckBox = e.Row.FindControl("chkActive")
        Dim cmdView As Button = e.Row.FindControl("cmdView")

        If chkActive.Checked = False Then
            ' hide the info button
            cmdView.Style.Add("display", "none")
        End If

    End If

End Sub

So, as noted, for running totals, highlght a row, color a row - or in this simple case hide/show the info button based on active column?

(and note you are NOT limited to just the controls on that row - you have full use of the whole database row if you wish durng the binding).

And we now see/get this:

enter image description here

And note once again, no looping or for next code.

Upvotes: 3

Related Questions