[ASP/VB.NET] index van rij in gesorteerde DataView vinden

Pagina: 1
Acties:
  • 273 views sinds 30-01-2008
  • Reageer

  • Mastakilla
  • Registratie: Februari 2001
  • Laatst online: 06-05 13:12
Vorige week had ik al wat gepost ivm het sorteren van een datagrid wat niet wou lukken,
ik toen dynamisch mijn select statement aangepast met order by om dit op te lossen
Dit werkte goed, maar later in het project kwam ik hierdoor in de problemen (de .Find functie van een DataView vereist eerst dat de property .Sort ingevult wordt)

Aangezien ik dacht dat ik die .Sort nodig had, ben ik dan maar gewoon van 0 af begonnen...

In mijn nieuwe asp pagina gebruik ik dan ook de officiele methode om te sorteren (dmv .Sort van een DataView in te stellen)

Mijn tabel bevat 1 primary key, en nog paar varchar velden... Van de primary key staat visible op false, dus hier kan niet op gesorteerd worden... de varchar velden zijn niet uniek, dus hiermee kan geen specifieke rij gevonden worden...

Nu wil ik juist adhv mijn primary key, de index van een rij vinden in een gesorteerde DataView...

Eerst dacht ik dat dit met de .Find functie van DataView kon, maar toen ik dit probeerde bleek de .Find functie enkel om een waarde te vinden in de kolom waar op gesorteerd wordt (en ik wil net een waarde van de primary key vinden)

Weet iemand misschien een andere functie of manier om de index van een rij in een gesorteerde DataView te vinden adhv mijn primary key (waar niet op gesorteerd wordt)

Bij voorbaat dank

  • sig69
  • Registratie: Mei 2002
  • Nu online
De bedoeling van dit alles is me nog niet geheel duidelijk, maar kan je niet iets met een datakeyfield doen?

Roomba E5 te koop


  • Mastakilla
  • Registratie: Februari 2001
  • Laatst online: 06-05 13:12
het doel is:
als ik een rij edit (EditItemIndex = positie van de rij in edit-modus), en ik klik dan op 1 van de kolomhoofdingen (om te sorteren op die kolom), dan wil ik de positie van de rij die geëdit werd ook weten in de anders gesorteerde DataView... Dan kan ik nl EditItemIndex updaten aan de nieuwe positie, nu behoud deze nl gewoon zijn positie

Ik heb ook ff het DataKeyField in mijn datagrid ingesteld, maar ik zou niet weten hoe ik hiermee de positie van die rij kan bepalen...

[ Voor 11% gewijzigd door Mastakilla op 02-03-2005 13:46 ]


  • sig69
  • Registratie: Mei 2002
  • Nu online
Zodat je de edititemindex daarna op hetzelfde record kan zetten ofzo?

Zo uit m'n hoofd weet ik er ook geen standaard methode voor. Je kan in ieder geval wel door je datakeys collectie loopen totdat je de juiste prim key tegenkomt, en aan de hand van de index daarvan je edititemindex zetten

Roomba E5 te koop


  • Mastakilla
  • Registratie: Februari 2001
  • Laatst online: 06-05 13:12
ic

zoiets had ik al in mijn hoofd als "last resort" optie, maar ik zou ook niet direct weten hoe dit moet

kan je mij een duwtje in de juiste richting geven?

  • Riegstar
  • Registratie: Februari 2003
  • Niet online

Riegstar

Wadapatja!

Ik denk niet dat het gewenst is om een Datagrid te sorteren wanneer hij in "Edit-modus" is.
Persoonlijk zou ik Sorteren uitschakelen wanneer hij in Edit-modus is.

Maar als het toch echt wilt doen, dan moet je wel de collectie doorlopen.

  • Mastakilla
  • Registratie: Februari 2001
  • Laatst online: 06-05 13:12
het is idd misschien wel een beetje raar om te doen, maar ik wou sowieso doorhebben hoe ik dit moest doen... dit zal nl niet het enige zijn waarom ik ooit een positie van een kolom zou willen weten

  • Mastakilla
  • Registratie: Februari 2001
  • Laatst online: 06-05 13:12
YES

tis me gelukt

moet alleen wel 2x een DataBind doen als er in "edit-modus" gesorteerd wordt

voor degenen die graag mijn oplossing weten, plak ik hem hieronder ff:
afdedit.ascx.vb
code:
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
Public MustInherit Class afdedit
    Inherits ControlBase

#Region " Web Form Designer Generated Code "

    'This call is required by the Web Form Designer.
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        Me.Conn = New System.Data.SqlClient.SqlConnection
        Me.DA = New System.Data.SqlClient.SqlDataAdapter
        Me.DS = New System.Data.DataSet
        Me.DV = New System.Data.DataView
        Me.DT = New System.Data.DataTable
        Me.SelComm = New System.Data.SqlClient.SqlCommand
        Me.UpdComm = New System.Data.SqlClient.SqlCommand
        '
        'Conn
        '
        Me.Conn.ConnectionString = "server=SHAREPOINT;Database=Intranet;uid=sa;pwd=bla"
        '
        'DA
        '
        Me.DA.SelectCommand = Me.SelComm
        Me.DA.UpdateCommand = Me.UpdComm
        '
        'DS
        '
        Me.DS.DataSetName = "DataS"
        '
        'DT
        '
        Me.DT.TableName = "afdelingen"
        '
        'SelComm
        '
        Me.SelComm.Connection = Me.Conn
        Me.SelComm.CommandText = "SELECT afdelingid, naam, omschrijving, url FROM Afdelingen"
        '
        'UpdComm
        '
        Me.UpdComm.Connection = Me.Conn
        Me.UpdComm.CommandText = "UPDATE Afdelingen SET naam = @naam, omschrijving = @omschrijving, url = @url " & _
            "WHERE (afdelingid = @afdelingid); SELECT naam, omschrijving, url, afdelingid " & _
            "FROM Afdelingen WHERE (afdelingid = @afdelingid)"
        Me.UpdComm.Parameters.Add(New System.Data.SqlClient.SqlParameter("@afdelingid", System.Data.SqlDbType.Int, 4, "afdelingid"))
        Me.UpdComm.Parameters.Add(New System.Data.SqlClient.SqlParameter("@naam", System.Data.SqlDbType.VarChar, 100, "naam"))
        Me.UpdComm.Parameters.Add(New System.Data.SqlClient.SqlParameter("@omschrijving", System.Data.SqlDbType.VarChar, 100, "omschrijving"))
        Me.UpdComm.Parameters.Add(New System.Data.SqlClient.SqlParameter("@url", System.Data.SqlDbType.VarChar, 100, "url"))

    End Sub
    Protected WithEvents DG As System.Web.UI.WebControls.DataGrid
    Protected WithEvents DA As System.Data.SqlClient.SqlDataAdapter
    Protected WithEvents DS As System.Data.DataSet
    Protected WithEvents DV As System.Data.DataView
    Protected WithEvents DT As System.Data.DataTable
    Protected WithEvents Conn As System.Data.SqlClient.SqlConnection
    Protected WithEvents SelComm As System.Data.SqlClient.SqlCommand
    Protected WithEvents UpdComm As System.Data.SqlClient.SqlCommand

    'NOTE: The following placeholder declaration is required by the Web Form Designer.
    'Do not delete or move it.
    Private designerPlaceholderDeclaration As System.Object

    Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
        'CODEGEN: This method call is required by the Web Form Designer
        'Do not modify it using the code editor.
        InitializeComponent()
    End Sub

#End Region

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Put user code to initialize the page here
        If Not IsPostBack Then
            Session("EditID") = -1
            Session("Direction") = " ASC"
            Session("SortField") = "naam"
            BindGrid()
        End If
    End Sub

    ' Sorteren op een bepaalde kolom door kolomhoofding aan te klikken
    Public Sub DG_sort(ByVal sender As System.Object, ByVal e As System.Web.UI.WebControls.DataGridSortCommandEventArgs)
        ' Als een rij in "edit-modus" is
        If DG.EditItemIndex <> -1 Then
            FindEditPosKey()
        End If
        ' Als er geklikt is op de kolom waarop al gesorteerd is
        If Session("SortField").ToString = e.SortExpression Then
            ' Indien oplopend wordt gesorteerd, aflopend sorteren, en analoog andersom
            If Session("Direction").ToString = " ASC" Then
                Session("Direction") = " DESC"
            Else
                Session("Direction") = " ASC"
            End If
        Else
            Session("Direction") = " ASC"
        End If
        ' Kolom onthouden waarop gesorteerd wordt
        Session("SortField") = e.SortExpression
        BindGrid()
    End Sub

    ' Edit-layout voor een bepaalde rij activeren
    Public Sub DG_Edit(ByVal sender As System.Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs)
        DG.EditItemIndex = e.Item.ItemIndex
        BindGrid()
    End Sub

    ' Updaten van een gewijzigde rij
    Public Sub DG_update(ByVal sender As System.Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs)
        ' definieren van de textboxes gecreeerd door de edit-layout te openen voor een rij
        Dim tb_omschrijving As TextBox = CType(e.Item.Cells(3).Controls(0), TextBox)
        Dim tb_url As TextBox = CType(e.Item.Cells(4).Controls(0), TextBox)
        ' vastleggen van alle cellen van de te wijzigen rij
        Dim afdelingid As Integer = CInt(e.Item.Cells(1).Text)
        Dim naam As String = e.Item.Cells(2).Text
        Dim omschrijving As String = tb_omschrijving.Text
        Dim url As String = tb_url.Text
        If omschrijving.Length = 0 Or omschrijving.Length > 30 Or Not Geen_SQL_Injection(omschrijving) Then
            ' invoercontrole van omschrijving
            Fout("Ongeldige omschrijving... De omschrijving moet minstens 1 teken en mag maximum 29 tekens zijn... " & _
                "Volgende tekens zijn niet toegelaten: ', "", *, <, >")
        ElseIf url.Length < 8 Then
            ' invoercontrole van url
            Fout("Ongeldige URL... Een URL begint met 'http://'...")
        ElseIf url.Substring(0, 7) <> "http://" Or Not Geen_SQL_Injection(url) Then
            ' verdere invoercontrole van url
            Fout("Ongeldige URL... Een URL begint met 'http://' en mag devolgende tekens niet bevatten: ', "", *, <, >")
        Else
            ' als alle invoercontrole doorlopen is
            ' sql parameters laden
            Me.UpdComm.Parameters("@afdelingid").Value() = afdelingid
            Me.UpdComm.Parameters("@naam").Value() = naam
            Me.UpdComm.Parameters("@omschrijving").Value() = omschrijving
            Me.UpdComm.Parameters("@url").Value() = url
            ' connectie openen, rij updaten, connectie sluiten, edit-layout ongedaan maken en datagrid herladen
            Conn.Open()
            Me.UpdComm.ExecuteNonQuery()
            Conn.Close()
            DG.EditItemIndex = -1
            BindGrid()
        End If
    End Sub

    ' Invoercontrole tegen SQL Injection
    Private Function Geen_SQL_Injection(ByVal code As String) As Boolean
        Return code.IndexOf("'") = -1 And code.IndexOf("*") = -1 And _
            code.IndexOf("<") = -1 And code.IndexOf(">") = -1 And code.IndexOf("""") = -1
    End Function

    ' Foutmelding bij het wijzigen van een veld
    Private Sub Fout(ByVal bericht As String)
        DG.EditItemIndex = -1           ' edit-layout ongedaan maken
        BindGrid()                      ' datagrid herladen
        Response.Write(bericht)         ' foutmelding tonen
    End Sub

    ' Edit-layout ongedaan maken en datagrid herladen
    Public Sub DG_Cancel(ByVal sender As System.Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs)
        DG.EditItemIndex = -1
        BindGrid()
    End Sub

    ' Zoekt de primary key van het veld in "edit-modus"
    Private Sub FindEditPosKey()
        ' Dataview vullen met gesorteerd op oude sorteer kolom
        DA.Fill(DS, "afdelingen")
        DV = DS.Tables("afdelingen").DefaultView
        DV.Sort = Session("SortField").ToString & Session("Direction").ToString
        ' Primary key van rij in "edit-modus" opslaan
        Session("EditID") = DV.Item(DG.EditItemIndex).Row.Item(0)
        ' DataSet leegmaken
        DS.Clear()
    End Sub

    ' Herlaad de grid gesorteerd op SortField
    Private Sub BindGrid()
        ' Dataview vullen en datagrid herladen
        DA.Fill(DS, "afdelingen")
        DV = DS.Tables("afdelingen").DefaultView
        DV.Sort = Session("SortField").ToString & Session("Direction").ToString
        DG.DataSource = DV
        DG.DataBind()
        ' Indien een rij in "edit-modus" stond
        If CInt(Session("EditID")) <> -1 Then
            Dim RijIndex As Integer = 0
            ' zolang er rijen zijn en zolang de primary key niet gevonden is, RijIndex verhogen
            While RijIndex < DG.Items.Count And CInt(DG.DataKeys(RijIndex)) <> CInt(Session("EditID"))
                RijIndex += 1
            End While
            ' zoeken naar rij in "edit-modus" uitschakelen
            Session("EditID") = -1
            ' de juiste rij in de "edit-modus" zetten
            DG.EditItemIndex = RijIndex
            ' DataSet leegmaken
            DS.Clear()
            BindGrid()
        End If
    End Sub

End Class

afdedit.ascx
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<%@ Control Language="vb" AutoEventWireup="false" Codebehind="afdedit.ascx.vb" Inherits="VABweb.afdedit" TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %>
<div runat="server">
<asp:DataGrid id="DG" DataKeyField="afdelingid" AutoGenerateColumns="False" runat="server" AllowSorting="True"
    OnSortCommand="DG_sort" OnUpdateCommand="DG_Update" OnCancelCommand="DG_Cancel" OnEditCommand="DG_Edit"
    GridLines="Vertical" AlternatingItemStyle-BorderColor="#000000" AlternatingItemStyle-BackColor="LightGrey"
    ItemStyle-HorizontalAlign="Center" ItemStyle-VerticalAlign="Middle" CellPadding="7">
    <AlternatingItemStyle HorizontalAlign="Center" BorderColor="Black" VerticalAlign="Middle" BackColor="White"></AlternatingItemStyle>
    <ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" BackColor="#CAC7A8"></ItemStyle>
    <HeaderStyle Font-Bold="True" ForeColor="White" BackColor="Gray"></HeaderStyle>
    <Columns>
        <asp:EditCommandColumn ButtonType="LinkButton" UpdateText="Update" CancelText="Cancel" EditText="Edit"></asp:EditCommandColumn>
        <asp:BoundColumn Visible="False" DataField="afdelingid" SortExpression="afdelingid" ReadOnly="True"
            HeaderText="Afdeling ID"></asp:BoundColumn>
        <asp:BoundColumn DataField="naam" SortExpression="naam" ReadOnly="True" HeaderText="Naam"></asp:BoundColumn>
        <asp:BoundColumn DataField="omschrijving" SortExpression="omschrijving" HeaderText="Omschrijving"></asp:BoundColumn>
        <asp:BoundColumn DataField="url" SortExpression="url" HeaderText="Url"></asp:BoundColumn>
    </Columns>
    <PagerStyle VerticalAlign="Middle" HorizontalAlign="Center"></PagerStyle>
</asp:DataGrid>
</div>


als iemand nog iets ziet dat beter kan, plz lemme know ;)

[ Voor 73% gewijzigd door Mastakilla op 04-03-2005 11:14 ]


  • Mastakilla
  • Registratie: Februari 2001
  • Laatst online: 06-05 13:12
hmz... had hem dus mooi aan het werken gekregen in apart project enkel om dit te ontwikkelen...

maar als ik hem nu in het grote project met de andere webpaginas en de menu structuur invoeg,
dan laad hij enkel de 1e keer (als IsNotPostback true is) de datagrid
wanneer ik op 1 vd knoppen drukken, dan herlaad hij wel de pagina, en is IsNotPostback wel false, maar hij triggered de event niet meer die bij die knop hoort
ik krijg dan ook een lege pagina na op 1 vd knoppen te drukken

dat hij de event niet triggered heb ik ontdekt door in iedere functie een stop te zetten en vervolgens te debuggen.. bij het herladen van de pagina na op een knop te klikken wordt enkel paga_load aangeroepen, en niet de event van die knop...

dit werkte wel in het aparte project

heeft iemand misschien een idee wat de oorzaak kan zijn van het niet gebeuren van de events gekoppeld aan de datagrid?

[ Voor 26% gewijzigd door Mastakilla op 02-03-2005 16:53 ]


  • Mastakilla
  • Registratie: Februari 2001
  • Laatst online: 06-05 13:12
ok

ik heb net het probleem een beetje meer weten te localiseren

Het probleem verschijnt wanneer ik, in afdedit.ascx.vb, ipv System.Web.UI.UserControl te inheriten, een zelf gemaakte klasse inherit die opzich zelf weer System.Web.UI.UserControl inherit...

Deze klasse, die in een Class Library zit, ControlBase.vb genoemt, zorgt voor een standaard layout op de site

als ik dus

Public Class afdedit
Inherits ControlBase

doe ipv

Public Class afdedit
Inherits System.Web.UI.UserControl

dan worden mijn events niet meer aangeroepen als er op een knop geklikt wordt, de page wordt nog wel herladen (page_load)... maar de event zelf wordt niet getriggered (er is dus geen bindgrid() en dus geen datagrid zichtbaar)

ik hoop dat iemand een idee heeft wat dit kan veroorzaken, want ik geraak er zelf niet echt uit...

dit is de structuur van mijn solution:

code:
1
2
3
4
5
6
solution:                                afdedit
   project (asp.net web application):    afdedit
      webform:                           default.aspx
      web user control:                  afdedit.ascx
   project (class library):              test
      klasse:                            ControlBase.vb


en hieronder volgt de bijhorende code:

default.aspx:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="default.aspx.vb" Inherits="afdedit.WebForm1"%>
<%@ Register TagPrefix="VAB" TagName="afdedit" Src="afdedit.ascx" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
    <HEAD>
        <title>WebForm1</title>
        <meta name="GENERATOR" content="Microsoft Visual Studio .NET 7.1">
        <meta name="CODE_LANGUAGE" content="Visual Basic .NET 7.1">
        <meta name="vs_defaultClientScript" content="JavaScript">
        <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
    </HEAD>
    <body MS_POSITIONING="GridLayout">
        <form id="Form1" method="post" runat="server">
            <VAB:afdedit runat="server" ID="afdedit" NAME="afdedit"></VAB:afdedit>
        </form>
    </body>
</HTML>


default.aspx.vb
code:
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
Imports test

Public Class WebForm1
    Inherits System.Web.UI.Page

#Region " Web Form Designer Generated Code "

    'This call is required by the Web Form Designer.
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

    End Sub

    'NOTE: The following placeholder declaration is required by the Web Form Designer.
    'Do not delete or move it.
    Private designerPlaceholderDeclaration As System.Object

    Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
        'CODEGEN: This method call is required by the Web Form Designer
        'Do not modify it using the code editor.
        InitializeComponent()
    End Sub

#End Region

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Put user code to initialize the page here
    End Sub

End Class


afdedit.ascx
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<%@ Control Language="vb" AutoEventWireup="false" Codebehind="afdedit.ascx.vb" Inherits="afdedit.afdedit" TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %>
<DIV id="divAfdeling" align="center" runat="server">
    <asp:DataGrid id="DG" DataKeyField="afdelingid" AutoGenerateColumns="False" runat="server" AllowSorting="True"
        OnSortCommand="DG_sort" OnUpdateCommand="DG_Update" OnCancelCommand="DG_Cancel" OnEditCommand="DG_Edit"
        GridLines="Vertical" AlternatingItemStyle-BorderColor="#000000" AlternatingItemStyle-BackColor="LightGrey"
        ItemStyle-HorizontalAlign="Center" ItemStyle-VerticalAlign="Middle" CellPadding="7">
        <AlternatingItemStyle HorizontalAlign="Center" BorderColor="Black" VerticalAlign="Middle" BackColor="White"></AlternatingItemStyle>
        <ItemStyle HorizontalAlign="Center" VerticalAlign="Middle" BackColor="#CAC7A8"></ItemStyle>
        <HeaderStyle Font-Bold="True" ForeColor="White" BackColor="Gray"></HeaderStyle>
        <Columns>
            <asp:EditCommandColumn ButtonType="LinkButton" UpdateText="Update" CancelText="Cancel" EditText="Edit"></asp:EditCommandColumn>
            <asp:BoundColumn Visible="False" DataField="afdelingid" SortExpression="afdelingid" ReadOnly="True"
                HeaderText="Afdeling ID"></asp:BoundColumn>
            <asp:BoundColumn DataField="naam" SortExpression="naam" ReadOnly="True" HeaderText="Naam"></asp:BoundColumn>
            <asp:BoundColumn DataField="omschrijving" SortExpression="omschrijving" HeaderText="Omschrijving"></asp:BoundColumn>
            <asp:BoundColumn DataField="url" SortExpression="url" HeaderText="Url"></asp:BoundColumn>
        </Columns>
        <PagerStyle VerticalAlign="Middle" HorizontalAlign="Center"></PagerStyle>
    </asp:DataGrid>
</DIV>


afdedit.ascx.vb
code:
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
Public Class afdedit
    Inherits ControlBase

#Region " Web Form Designer Generated Code "

    'This call is required by the Web Form Designer.
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        Me.Conn = New System.Data.SqlClient.SqlConnection
        Me.DA = New System.Data.SqlClient.SqlDataAdapter
        Me.SelComm = New System.Data.SqlClient.SqlCommand
        Me.UpdComm = New System.Data.SqlClient.SqlCommand
        Me.DS = New System.Data.DataSet
        Me.DV = New System.Data.DataView
        Me.DT = New System.Data.DataTable
        CType(Me.DS, System.ComponentModel.ISupportInitialize).BeginInit()
        CType(Me.DV, System.ComponentModel.ISupportInitialize).BeginInit()
        CType(Me.DT, System.ComponentModel.ISupportInitialize).BeginInit()
        '
        'Conn
        '
        Me.Conn.ConnectionString = "server=SHAREPOINT;Database=Intranet;uid=sa;pwd=VAB7vtb5$"
        '
        'DA
        '
        Me.DA.SelectCommand = Me.SelComm
        Me.DA.UpdateCommand = Me.UpdComm
        '
        'SelComm
        '
        Me.SelComm.CommandText = "SELECT afdelingid, naam, omschrijving, url FROM Afdelingen"
        Me.SelComm.Connection = Me.Conn
        '
        'UpdComm
        '
        Me.UpdComm.CommandText = "UPDATE Afdelingen SET naam = @naam, omschrijving = @omschrijving, url = @url WHER" & _
        "E (afdelingid = @afdelingid); SELECT naam, omschrijving, url, afdelingid FROM Af" & _
        "delingen WHERE (afdelingid = @afdelingid)"
        Me.UpdComm.Connection = Me.Conn
        Me.UpdComm.Parameters.Add(New System.Data.SqlClient.SqlParameter("@afdelingid", System.Data.SqlDbType.Int, 4, "afdelingid"))
        Me.UpdComm.Parameters.Add(New System.Data.SqlClient.SqlParameter("@naam", System.Data.SqlDbType.VarChar, 100, "naam"))
        Me.UpdComm.Parameters.Add(New System.Data.SqlClient.SqlParameter("@omschrijving", System.Data.SqlDbType.VarChar, 100, "omschrijving"))
        Me.UpdComm.Parameters.Add(New System.Data.SqlClient.SqlParameter("@url", System.Data.SqlDbType.VarChar, 100, "url"))
        '
        'DS
        '
        Me.DS.DataSetName = "DataS"
        Me.DS.Locale = New System.Globalization.CultureInfo("nl-BE")
        '
        'DT
        '
        Me.DT.TableName = "afdelingen"
        CType(Me.DS, System.ComponentModel.ISupportInitialize).EndInit()
        CType(Me.DV, System.ComponentModel.ISupportInitialize).EndInit()
        CType(Me.DT, System.ComponentModel.ISupportInitialize).EndInit()

    End Sub
    Protected WithEvents DG As System.Web.UI.WebControls.DataGrid
    Protected WithEvents DA As System.Data.SqlClient.SqlDataAdapter
    Protected WithEvents DS As System.Data.DataSet
    Protected WithEvents DV As System.Data.DataView
    Protected WithEvents DT As System.Data.DataTable
    Protected WithEvents Conn As System.Data.SqlClient.SqlConnection
    Protected WithEvents SelComm As System.Data.SqlClient.SqlCommand
    Protected WithEvents UpdComm As System.Data.SqlClient.SqlCommand
    Protected WithEvents divAfdeling As System.Web.UI.HtmlControls.HtmlGenericControl

    'NOTE: The following placeholder declaration is required by the Web Form Designer.
    'Do not delete or move it.
    Private designerPlaceholderDeclaration As System.Object

    Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
        'CODEGEN: This method call is required by the Web Form Designer
        'Do not modify it using the code editor.
        InitializeComponent()
    End Sub

#End Region

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Put user code to initialize the page here
        If Not IsPostBack Then
            Session("EditID") = -1
            Session("Direction") = " ASC"
            Session("SortField") = "naam"
            BindGrid()
        End If
    End Sub

    ' Sorteren op een bepaalde kolom door kolomhoofding aan te klikken
    Public Sub DG_sort(ByVal sender As System.Object, ByVal e As System.Web.UI.WebControls.DataGridSortCommandEventArgs) Handles DG.SortCommand
        ' Als een rij in "edit-modus" is
        If DG.EditItemIndex <> -1 Then
            FindEditPosKey()
        End If
        ' Als er geklikt is op de kolom waarop al gesorteerd is
        If CType(Session("SortField"), String) = e.SortExpression Then
            ' Indien oplopend wordt gesorteerd, aflopend sorteren, en analoog andersom
            If CType(Session("Direction"), String) = " ASC" Then
                Session("Direction") = " DESC"
            Else
                Session("Direction") = " ASC"
            End If
        Else
            Session("Direction") = " ASC"
        End If
        ' Kolom onthouden waarop gesorteerd wordt
        Session("SortField") = e.SortExpression
        BindGrid()
    End Sub

    ' Edit-layout voor een bepaalde rij activeren
    Public Sub DG_Edit(ByVal sender As System.Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles DG.EditCommand
        DG.EditItemIndex = e.Item.ItemIndex
        BindGrid()
    End Sub

    ' Updaten van een gewijzigde rij
    Public Sub DG_update(ByVal sender As System.Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles DG.UpdateCommand
        ' definieren van de textboxes gecreeerd door de edit-layout te openen voor een rij
        Dim tb_omschrijving As TextBox = CType(e.Item.Cells(3).Controls(0), TextBox)
        Dim tb_url As TextBox = CType(e.Item.Cells(4).Controls(0), TextBox)
        ' vastleggen van alle cellen van de te wijzigen rij
        Dim afdelingid As Integer = CInt(e.Item.Cells(1).Text)
        Dim naam As String = e.Item.Cells(2).Text
        Dim omschrijving As String = tb_omschrijving.Text
        Dim url As String = tb_url.Text
        If omschrijving.Length = 0 Or omschrijving.Length > 30 Or Not Geen_SQL_Injection(omschrijving) Then
            ' invoercontrole van omschrijving
            Fout("Ongeldige omschrijving... De omschrijving moet minstens 1 teken en mag maximum 29 tekens zijn... " & _
                "Volgende tekens zijn niet toegelaten: ', "", *, <, >")
        ElseIf url.Length < 8 Then
            ' invoercontrole van url
            Fout("Ongeldige URL... Een URL begint met 'http://'...")
        ElseIf url.Substring(0, 7) <> "http://" Or Not Geen_SQL_Injection(url) Then
            ' verdere invoercontrole van url
            Fout("Ongeldige URL... Een URL begint met 'http://' en mag devolgende tekens niet bevatten: ', "", *, <, >")
        Else
            ' als alle invoercontrole doorlopen is
            ' sql parameters laden
            Me.UpdComm.Parameters("@afdelingid").Value() = afdelingid
            Me.UpdComm.Parameters("@naam").Value() = naam
            Me.UpdComm.Parameters("@omschrijving").Value() = omschrijving
            Me.UpdComm.Parameters("@url").Value() = url
            ' connectie openen, rij updaten, connectie sluiten, edit-layout ongedaan maken en datagrid herladen
            Conn.Open()
            Me.UpdComm.ExecuteNonQuery()
            Conn.Close()
            DG.EditItemIndex = -1
            BindGrid()
        End If
    End Sub

    ' Invoercontrole tegen SQL Injection
    Private Function Geen_SQL_Injection(ByVal code As String) As Boolean
        Return code.IndexOf("'") = -1 And code.IndexOf("*") = -1 And _
            code.IndexOf("<") = -1 And code.IndexOf(">") = -1 And code.IndexOf("""") = -1
    End Function

    ' Foutmelding bij het wijzigen van een veld
    Private Sub Fout(ByVal bericht As String)
        DG.EditItemIndex = -1           ' edit-layout ongedaan maken
        BindGrid()                      ' datagrid herladen
        Response.Write(bericht)         ' foutmelding tonen
    End Sub

    ' Edit-layout ongedaan maken en datagrid herladen
    Public Sub DG_Cancel(ByVal sender As System.Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles DG.CancelCommand
        DG.EditItemIndex = -1
        BindGrid()
    End Sub

    ' Zoekt de primary key van het veld in "edit-modus"
    Private Sub FindEditPosKey()
        ' Dataview vullen met gesorteerd op oude sorteer kolom
        DA.Fill(DS, "afdelingen")
        DV = DS.Tables("afdelingen").DefaultView
        DV.Sort = CType(Session("SortField"), String) & CType(Session("Direction"), String)
        ' Primary key van rij in "edit-modus" opslaan
        Session("EditID") = DV.Item(DG.EditItemIndex).Row.Item(0)
        ' DataSet leegmaken
        DS.Clear()
    End Sub

    ' Herlaad de grid gesorteerd op SortField
    Private Sub BindGrid()
        ' Dataview vullen en datagrid herladen
        DA.Fill(DS, "afdelingen")
        DV = DS.Tables("afdelingen").DefaultView
        DV.Sort = CType(Session("SortField"), String) & CType(Session("Direction"), String)
        DG.DataSource = DV
        DG.DataBind()
        ' Indien een rij in "edit-modus" stond
        If CInt(Session("EditID")) <> -1 Then
            Dim RijIndex As Integer = 0
            ' zolang er rijen zijn en zolang de primary key niet gevonden is, RijIndex verhogen
            While RijIndex < DG.Items.Count And CInt(DG.DataKeys(RijIndex)) <> CInt(Session("EditID"))
                RijIndex += 1
            End While
            ' zoeken naar rij in "edit-modus" uitschakelen
            Session("EditID") = -1
            ' de juiste rij in de "edit-modus" zetten
            DG.EditItemIndex = RijIndex
            ' DataSet leegmaken
            DS.Clear()
            BindGrid()
        End If
    End Sub

End Class


ControlBase.vb
code:
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
33
34
35
Imports System
Imports System.Web
Imports System.Web.UI
Imports System.Configuration
Imports System.Data.SqlClient
Imports System.Resources

' ************************************************************
'   Controle klasse voor standaard layout van een pagina
' ************************************************************

Public Class ControlBase
    Inherits System.Web.UI.UserControl
    Private sHeader As String

    Public Property Header() As String
        Get
            Return sHeader
        End Get
        Set(ByVal Value As String)
            ' Opmaak van de header
            sHeader = "<h1>" & Value & "</h1>"
        End Set
    End Property

    Private Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.PreRender
        ' Toevoegen van een header 
        Me.Controls.AddAt(0, New LiteralControl(Header()))
    End Sub

    'Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
    '    writer.WriteLine(Header())
    'End Sub

End Class

[ Voor 61% gewijzigd door Mastakilla op 04-03-2005 11:14 ]


  • Mastakilla
  • Registratie: Februari 2001
  • Laatst online: 06-05 13:12
ik heb net ontdekt dat als ik de functie "Page_PreRender" in ControlBase.vb in commentaar zet, dat de events wel gebeuren en alles goed werkt...

Nu heb ik die Page_PreRender wel nodig, vandaar dat ik me nog steeds afvraag hoe ik dit kan oplossen?

Ik veronderstel dat ik in die Page_PreRender op 1 of andere manier de events moet doorgeven aan mijn afdedit.ascx.vb ofzo?
maar hoe heb ik geen flauw idee van....

  • Mastakilla
  • Registratie: Februari 2001
  • Laatst online: 06-05 13:12
niemand?
Pagina: 1