Bij het maken van applicaties werk ik graag met eigen controls. Bij het maken van windows client applicaties loop je wel eens tegen nieuwe dingen aan, zoals een designer die code uitvoert terwijl je aan het programmeren bent en zelfs je code ongevraagd aanpast (wat wel weer mogelijkheden geeft). Daarnaast is het handig om zaken die je vaak doet al af te vangen.
Dit gaat over de DataGridView control uit Windows Forms VB.NET, versie 2.0 van het framework.
Wat ik wilde was het volgende:
Elke keer als ik een DataGridView op mijn form sleepte moest ik allemaal properties instellen, daar wilde ik vanaf, daarnaast wil ik met controls altijd meer dan de standaard.
Omdat ik van GUID’s hou wilde ik dat de sleutel van een tabel altijd verborgen blijft in het datagrid.
Je weet dat als je een eigen control maakt en je gebruikt bijv. “Inherit” dat deze na compileren er als een sleepbaar control in je toolbox bijkomt.
Onderstaat de code die ik heb gebruikt voor mijn eigen datagridview.
Bij Sub New() geef ik de standaard eigenschappen mee, werkt als een trein.
Dan de eigenschap SleutelKolomNaam. Als ik een datatable als datasource inzet wil ik dat de sleutelkolom als onzichtbare kolom wordt toegevoegd altijd als eerste kolom (cell(0)).
Als de eigenschap gezet wordt wordt de sub AddSleutelKolom toegevoegd. Alleen hier “kickt” de visual studio 2005 designer in. Als ik de eigenschap invoer, wordt er een kolom ook in de designer toegevoegd. Maak je de eigenschap weer leeg of verander je deze, dan ruimt ie de kolommen niet netjes op.
Vandaar dat ik kijk of er een “HuidigeGebruiker” object is. In designtime is deze er niet en wordt de kolom dus alleen nog maar runtime gezet.
Aardige leeslink is overigens ook http://www.codeproject.com/csharp/wsod.asp lees daar ook weer de WSOD uitleg van Microsoft.
Al met al een paar leerzame uurtjes.....
Code:
Public Class aDataGridView
Inherits DataGridView
Sub New()
' Standaard zaken bij een nieuw DataGridView
Me.ReadOnly = True
Me.AllowUserToAddRows = False
Me.AutoResizeColumns()
Me.MultiSelect = False
End Sub
Private Sub AddSleutelKolom(ByVal _Veld As String)
' Voeg sleutel kolom toe
If Columns.Contains("SleutelKolom") Then
Columns.Remove("SleutelKolom")
End If
If IsNothing(_Veld) OrElse _Veld.Length = 0 Then
Exit Sub
End If
Dim col As New System.Windows.Forms.DataGridViewTextBoxColumn
col.DataPropertyName = _Veld
col.HeaderText = "SleutelKolom"
col.Name = "SleutelKolom"
col.ReadOnly = True
col.Visible = False
Me.Columns.AddRange(New System.Windows.Forms.DataGridViewColumn() {col})
End Sub
Private _SleutelKolomNaam As String
Public Property SleutelKolomNaam() As String
Get
Return _SleutelKolomNaam
End Get
Set(ByVal value As String)
_SleutelKolomNaam = value
' Sleutel kolom toevoegen/verwijderen De check op een gebruiker is om de designer te foppen omdat ie anders
' controls gaat aanmaken
If Not IsNothing(Functions.HuidigeGebruiker) Then
AddSleutelKolom(_SleutelKolomNaam)
End If
End Set
End Property
End Class