Een klant van mij wil per se binnen een gridview op een pagina zowel de numerieke aanduiding als een vorige-volgende knop hebben. Da's prima, maar dat kan de gridview control niet.
Daarom heb ik een eventhandler op het RowCreated event gemaakt, die -indien de pagersettings numeriek zijn- een vorige en volgende knop aanmaakt, die weer een subje aanroepen om de volgende pagina te selecteren. Het werkt als een tierelier.
De code:
De RowCreated eventhandler
De Vorige/Volgende knop eventhandler
Het koppelen van een gridview aan de rowcreated eventhandler
Nu heb ik hierover twee vragen:
Kan ik op een snellere manier bij de parent gridview van de linkbutton komen? Dit aangezien ik de methode die ik nu toepas behoorlijk lelijk en gevoelig voor fouten vind:
Ik heb ook al geprobeerd om de naam van de gridview als commandargument mee te geven, maar dan kan ik de gridview niet vinden met findcontrol.
Vraag twee:
Hoe kan ik op een eenvoudige manier ervoor zorgen dat alle pagina's binnen de webapp gebruik maken van deze code? Ik kan de code natuurlijk in een class hangen, maar dan zou ik nog steeds iedere gridview in de page_init moeten toevoegen. Ik zoek dus een manier om met een stukje generieke code die ik in iedere page_init kan hangen de eventhandler "AddPrevNextToGrid" aan alle gridviews te hangen. Moet dat door alle controls hangend aan het page-object heen te lopen en kijken of het toevallig een gridview is? Het lijkt me dat dit makkelijker kan.
Waarom dan geen usercontrol vraag je je wellicht af? Mijn opdrachtgever heeft in al zijn wijsheid besloten dat dat nou net niet is toegestaan. Zou slecht zijn voor het onderhoud. Argumenten dat het onderhoud er makkelijker op wordt, worden in de wind geslagen.
Daarom heb ik een eventhandler op het RowCreated event gemaakt, die -indien de pagersettings numeriek zijn- een vorige en volgende knop aanmaakt, die weer een subje aanroepen om de volgende pagina te selecteren. Het werkt als een tierelier.
De code:
De RowCreated eventhandler
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| Protected Sub AddPrevNextToGrid(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) If e.Row.RowType = DataControlRowType.Pager Then Dim pagerTable As Table = DirectCast(e.Row.Cells(0).Controls(0), Table) Dim grd As GridView = DirectCast(sender, GridView) Dim pagerRow As TableRow = pagerTable.Rows(0) Dim pagerSettings As PagerSettings = grd.PagerSettings Dim cellsCount As Integer = pagerRow.Cells.Count If pagerSettings.Mode = PagerButtons.Numeric OrElse pagerSettings.Mode = PagerButtons.NumericFirstLast Then 'check whether previous button exists Dim btnPrev As New LinkButton btnPrev.Text = pagerSettings.PreviousPageText btnPrev.CommandName = "Prev" If grd.PageIndex <= 0 Then btnPrev.Visible = False AddHandler btnPrev.Command, AddressOf PrevNextClick Dim PrevCell As New TableCell PrevCell.Controls.Add(btnPrev) pagerRow.Cells.AddAt(0, PrevCell) 'check whether previous button exists Dim btnNext As New LinkButton btnNext.Text = pagerSettings.NextPageText btnNext.CommandName = "Next" If grd.PageIndex >= grd.PageCount - 1 Then btnNext.Visible = False AddHandler btnNext.Command, AddressOf PrevNextClick Dim NextCell As New TableCell NextCell.Controls.Add(btnNext) pagerRow.Cells.Add(NextCell) End If End If End Sub |
De Vorige/Volgende knop eventhandler
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
| Protected Sub PrevNextClick(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.CommandEventArgs) Dim lnkBut As LinkButton = sender Dim grd As GridView = lnkBut.Parent.Parent.Parent.Parent.Parent.Parent.Parent Select Case e.CommandName.ToUpper Case "PREV" grd.PageIndex += -1 Case "NEXT" grd.PageIndex += 1 End Select End Sub |
Het koppelen van een gridview aan de rowcreated eventhandler
Visual Basic .NET:
1
2
3
| Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init AddHandler GridLopendeZakenMap.RowCreated, AddressOf AddPrevNextToGrid End Sub |
Nu heb ik hierover twee vragen:
Kan ik op een snellere manier bij de parent gridview van de linkbutton komen? Dit aangezien ik de methode die ik nu toepas behoorlijk lelijk en gevoelig voor fouten vind:
Visual Basic .NET:
1
| lnkBut.Parent.Parent.Parent.Parent.Parent.Parent.Parent |
Ik heb ook al geprobeerd om de naam van de gridview als commandargument mee te geven, maar dan kan ik de gridview niet vinden met findcontrol.
Vraag twee:
Hoe kan ik op een eenvoudige manier ervoor zorgen dat alle pagina's binnen de webapp gebruik maken van deze code? Ik kan de code natuurlijk in een class hangen, maar dan zou ik nog steeds iedere gridview in de page_init moeten toevoegen. Ik zoek dus een manier om met een stukje generieke code die ik in iedere page_init kan hangen de eventhandler "AddPrevNextToGrid" aan alle gridviews te hangen. Moet dat door alle controls hangend aan het page-object heen te lopen en kijken of het toevallig een gridview is? Het lijkt me dat dit makkelijker kan.
Waarom dan geen usercontrol vraag je je wellicht af? Mijn opdrachtgever heeft in al zijn wijsheid besloten dat dat nou net niet is toegestaan. Zou slecht zijn voor het onderhoud. Argumenten dat het onderhoud er makkelijker op wordt, worden in de wind geslagen.