Ik zit een beetje te spelen met de GridView uit .NET en kom een raar probleem tegen.
Eerst maar wat code:
De GridView zelf:
De OnRowCreated eventhandler
Het bovenstaande maakt het mogelijk een GridViewRow te "highlighten" en daarnaast is het hiermee mogelijk op een GridViewRow te klikken om deze zo te selecteren.
Het highlighten werkt dus, maar het klikken wordt niet correct afgehandeld.
Nu heb ik uiteraard mijn code al gedebugged (
) en ben ook achter de oorzaak van de foute afhandeling. Wanneer je namelijk in de HTML output kijkt, zie je dat elke button van elke GridViewRow dezelfde ID heeft, namelijk btnSelect.
Ik snap alleen niet waarom dit is, want als ik i.p.v. de OnRowCreated event het OnRowDataBound gebruik is de HTML output wel correct; elke button van elke GridViewRow heeft een uniek ID. Ik kan echter dat event niet gebruiken voor wat ik wil, omdat mijn routine gerunt dient te worden bij elke "refresh" van de GridView.
Volgens gebruik ik wel het juiste event, maar waarom gaat het dan toch mis?
Eerst maar wat code:
De GridView zelf:
code:
1
2
3
4
5
6
7
8
9
10
11
| <asp:GridView ID="GamesGridView" runat="server" AllowPaging="True" AllowSorting="True" GridLines="None"
AutoGenerateColumns="False" DataKeyNames="GameID" DataSourceID="odsGamesGrid" Width="100%">
<Columns>
<asp:BoundField DataField="Title" HeaderText="Game titel" SortExpression="Title" />
<asp:TemplateField>
<ItemTemplate>
<asp:Button runat="server" style="display:none" CommandName="Select" Text="Select" ID="btnSelect" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView> |
De OnRowCreated eventhandler
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| Protected Sub GamesGridView_RowCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) _
Handles GamesGridView.RowCreated
Dim onMouseOverStyle As String = "this.className='hovered'; this.style.cursor='hand';"
Dim onMouseOutStyle As String = "this.className='@CssClass';"
Dim rowCssClass As String = String.Empty
If e.Row.RowType = DataControlRowType.DataRow Then
Select Case e.Row.RowState
Case DataControlRowState.Alternate
rowCssClass = GamesGridView.AlternatingRowStyle.CssClass
Case DataControlRowState.Edit
rowCssClass = GamesGridView.EditRowStyle.CssClass
Case DataControlRowState.Normal
rowCssClass = GamesGridView.RowStyle.CssClass
Case DataControlRowState.Selected
rowCssClass = GamesGridView.SelectedRowStyle.CssClass
End Select
If Me.GamesGridView.EditIndex = -1 Then
e.Row.Attributes.Add("onClick", "document.getElementById('" & e.Row.FindControl("btnSelect").ClientID & "').click();")
End If
e.Row.Attributes.Add("onmouseover", onMouseOverStyle)
e.Row.Attributes.Add("onmouseout", onMouseOutStyle.Replace("@CssClass", rowCssClass))
End If
End Sub |
Het bovenstaande maakt het mogelijk een GridViewRow te "highlighten" en daarnaast is het hiermee mogelijk op een GridViewRow te klikken om deze zo te selecteren.
Het highlighten werkt dus, maar het klikken wordt niet correct afgehandeld.
Nu heb ik uiteraard mijn code al gedebugged (
Ik snap alleen niet waarom dit is, want als ik i.p.v. de OnRowCreated event het OnRowDataBound gebruik is de HTML output wel correct; elke button van elke GridViewRow heeft een uniek ID. Ik kan echter dat event niet gebruiken voor wat ik wil, omdat mijn routine gerunt dient te worden bij elke "refresh" van de GridView.
Volgens gebruik ik wel het juiste event, maar waarom gaat het dan toch mis?