"Inline" function: the function never hits

I am trying to create a tabbed menu for an asp.net site that I am working on. Obviously, one of the prerequisites is to color the current tab differently so that the user can know which tab they are currently on.

To do this, I made this method in my code:

Protected Function GetCssClass(ByVal ctrl As LinkButton) As String
        If ctrl.ID = currentLink Then
            Return "current"
        Else
            Return String.Empty
        End If
    End Function

      

and I am calling a method like this in my aspx page:

<asp:LinkButton ID="LinkButton1" runat="server" PostBackUrl="/Default.aspx" CssClass="<%#GetCssClass(LinkButton1) %>" >Home</asp:LinkButton>                    
<asp:LinkButton ID="LinkButton2" runat="server" PostBackUrl="/Directory/page1.aspx" CssClass="<%#GetCssClass(LinkButton2) %>" >Page1</asp:LinkButton>

      

But the method never gets hit ... As I understand it, the method should be called every time it is drawn LinkButton

...

Does anyone have any idea why?

Thanks in advance!


Edit: Likewise, all this code is on the homepage.


Edit2: Here are the changes I made as suggested by Quagland .

In the aspx homepage:

<asp:HiddenField ID="currentLink" runat="server" />
<asp:LinkButton ID="LinkButton1" runat="server" PostBackUrl="/Default.aspx" OnClick="LinkButton_Click" OnPreRender="LinkButton_PreRender" >Home</asp:LinkButton>
<asp:LinkButton ID="LinkButton2" runat="server" PostBackUrl="/OtherDirectory/Page1.aspx" OnClick="LinkButton_Click" OnPreRender="LinkButton_PreRender" >Page1</asp:LinkButton>
<asp:LinkButton ID="LinkButton3" runat="server" PostBackUrl="/OtherDirectory/Page2.aspx" OnClick="LinkButton_Click" OnPreRender="LinkButton_PreRender" >Page2</asp:LinkButton>
<asp:LinkButton ID="LinkButton4" runat="server" PostBackUrl="/OtherDirectory/Page3.aspx" OnClick="LinkButton_Click" OnPreRender="LinkButton_PreRender" >Page3</asp:LinkButton>

      

And in the code behind:

 Protected Sub LinkButton_Click(ByVal sender As Object, ByVal e As EventArgs) Handles LinkButton1.Click, LinkButton2.Click, LinkButton3.Click, LinkButton4.Click, LinkButton5.Click, LinkButton6.Click, LinkButton7.Click, LinkButton8.Click
        Dim lnk As LinkButton = CType(sender, LinkButton)
        currentLink.Value = lnk.ID
    End Sub

    Protected Function GetCssClass(ByVal ctrl As LinkButton) As String
        If ctrl.ID = currentLink.Value Then
            Return "current"
        Else
            Return String.Empty
        End If
    End Function


    Protected Sub LinkButton_PreRender(ByVal sender As Object, ByVal e As EventArgs) Handles LinkButton1.PreRender, LinkButton2.PreRender, LinkButton3.PreRender, LinkButton4.PreRender, LinkButton5.PreRender, LinkButton6.PreRender, LinkButton7.PreRender, LinkButton8.PreRender
        Dim lnk As LinkButton = CType(sender, LinkButton)
        lnk.CssClass = GetCssClass(lnk)
    End Sub

      

The problem is that the click event doesn't always fire. On the first click, nothing happens, but on the second click on the tab, the click event fires correctly. Any hint?

Edit3: Could it be that the value stored in the hidden field is reset every time the main page is reloaded (I mean, every link points to a pair of main page + content page)?

+2


a source to share


5 answers


I quickly tested a solution that might work for you. I just don't know where your currentlink variable came from. I have implemented it as a hidden field here.

In Masterpage.aspx:

<asp:HiddenField ID="currentLink" runat="server" />
<asp:LinkButton ID="LinkButton1" runat="server">Home</asp:LinkButton>
<asp:LinkButton ID="LinkButton2" runat="server">Page1</asp:LinkButton>

      

In the code behind: use the original GetCssClass function by adding the following:

Protected Sub LinkButton_PreRender(ByVal sender As Object, ByVal e As System.EventArgs)
                                    Handles LinkButton1.PreRender, LinkButton2.PreRender
    Dim lnk As LinkButton = CType(sender, LinkButton)
    lnk.CssClass = GetCssClass(lnk)
End Sub

      

I put it in PreRender because I used LinkButton click events to set the value of the hidden field (and the click happens after loading, but before PreRender):

Protected Sub LinkButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) _
                                Handles LinkButton1.Click, LinkButton2.Click
    Dim lnk As LinkButton = CType(sender, LinkButton)
    currentLink.Value = lnk.ID

End Sub

      

also if there are multiple Linkbuttons you can declare as:

 <asp:LinkButton ID="LinkButton1" runat="server" OnClick="LinkButton_Click" OnPreRender="LinkButton_PreRender">Home</asp:LinkButton>

      



EDIT: Here's another solution that will work with backlinks. Not a lot of code, but you need to put some on each page. Anyway:

Masterpage.aspx:

<asp:LinkButton ID="LinkButton1" runat="server" PostBackUrl="Default.aspx">Home</asp:LinkButton>
<asp:LinkButton ID="LinkButton2" runat="server" PostBackUrl="Page1.aspx">Page1</asp:LinkButton>
<asp:LinkButton ID="LinkButton3" runat="server" PostBackUrl="Page2.aspx">Page2</asp:LinkButton>
<asp:LinkButton ID="LinkButton4" runat="server" PostBackUrl="Page3.aspx">Page3</asp:LinkButton>   

      

Masterpage.aspx.vb:

Public Sub SetCssClass(ByVal ctrl As String)
    CType(FindControl(ctrl), LinkButton).CssClass = "current"
End Sub

      

All content pages: * .aspx: add this directive to create a strongly typed link to the master page

<%@ MasterType VirtualPath="~/MasterPage.master" %>

      

...

* aspx.vb:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Master.SetCssClass("LinkButton1") '' << put the name of the relevant link button here
End Sub

      

+1


a source


You need to use <%= ... %>

(i.e. replace #

with =

).

The hash form is used with data binding, you just want to generate the output.



For .NET 4, prefer <%: ... %>

(use colon) for auto HTML encoding.

+2


a source


Set CssClass in code. This will indicate your intent more clearly than calling DataBind on your links if you are using data binding syntax. Since you are doing this for multiple controls, you can use them in the ApplyCssClasses method.

+1


a source


I'm not sure why <% =%> isn't working, but personally I don't like mixing code and markup, I like keeping them completely separate.

I would suggest setting the CSS class in code, perhaps on a page load event.

lnkPopulate.Cssclass = "current"

+1


a source


<%# ... %>

will work if you are ok with LinkButton1.DataBind()

in your code lag at the appropriate time.

0


a source







All Articles