custom control mydatagrid avec Enter transforme en Tab
bonjour gilles_906
On y est presque avec ProcessDataGridViewKey ET ProcessDialogKey mais plus simple encore si on les "overriden" dans un custom datagridview
voici un datagrid qui transforme le Enter en Tab mais quid du Tab.....
snippet code qui marche à merveille:
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
|
Class MyDataGridView
Inherits DataGridView
Protected Overloads Overrides Function ProcessDialogKey(ByVal keyData As Keys) As Boolean
If keyData = Keys.Enter Then
MyBase.ProcessTabKey(Keys.Tab)
Return True
End If
Return MyBase.ProcessDialogKey(keyData)
End Function
Protected Overloads Overrides Function ProcessDataGridViewKey(ByVal e As KeyEventArgs) As Boolean
If e.KeyCode = Keys.Enter Then
MyBase.ProcessTabKey(Keys.Tab)
Return True
End If
Return MyBase.ProcessDataGridViewKey(e)
End Function
End Class
'winform de test
Public Class Form3
Dim testDataTable As DataTable
Private Sub btnCreeDataTable_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCreeDataTable.Click
'Cree DataTable test
testDataTable = New DataTable
'Cree 3 colonnes
Dim nomCol As String = String.Empty
nomCol = "Nom"
AddColumn(nomCol, testDataTable)
nomCol = "Prenom"
AddColumn(nomCol, testDataTable)
nomCol = "Adresse"
AddColumn(nomCol, testDataTable)
'Fill avec 5 rows
Dim dr As DataRow
For i As Integer = 0 To 5
dr = testDataTable.NewRow
dr.Item(0) = "Nom" & (i + 1).ToString
dr.Item(1) = "Prenom" & (i + 1).ToString
dr.Item(2) = "Adresse" & (i + 1).ToString
testDataTable.Rows.Add(dr)
Next
'Binding à MyDataGridView1
Me.MyDataGridView1.DataSource = testDataTable
'binding a 2 TextBox
'
Me.txtNom.DataBindings.Add("Text", testDataTable, "Nom")
Me.txtPrenom.DataBindings.Add("Text", testDataTable, "Prenom")
'binding a un listbox(idem pour combobox)
'
Me.lstAdresse.DataSource = testDataTable
Me.lstAdresse.DisplayMember = "Adresse"
Me.lstAdresse.ValueMember = "Adresse"
End Sub
Private Sub AddColumn(ByVal colName As String, ByVal dt As DataTable)
Dim col As DataColumn = New DataColumn
col.Caption = colName
col.ColumnName = colName
col.DataType = GetType(String)
dt.Columns.Add(col)
End Sub
End Class |
bon code................
derouter Enter vers Touche Home-Droite au lieu de Tab
rebonjour gilles_906
Dans le meme sillage et toujours de source MSDN Doc voici un autre snippet qui deroute enter vers la touche home-droite,ce qui va sans dire, qu'on ne perds pas le benefice de la touche Tab qui permet de naviguer en vertical.
Toujours preconise par MSDN un simple custom control DataGriew:
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
|
Public Class CustomDataGridView
Inherits DataGridView
<System.Security.Permissions.UIPermission( _
System.Security.Permissions.SecurityAction.LinkDemand, _
Window:=System.Security.Permissions.UIPermissionWindow.AllWindows)> _
Protected Overrides Function ProcessDialogKey( _
ByVal keyData As Keys) As Boolean
' Extract the key code from the key value.
Dim key As Keys = keyData And Keys.KeyCode
' Handle the ENTER key as if it were a RIGHT ARROW key.
If key = Keys.Enter Then
Return Me.ProcessRightKey(keyData)
End If
Return MyBase.ProcessDialogKey(keyData)
End Function
<System.Security.Permissions.SecurityPermission( _
System.Security.Permissions.SecurityAction.LinkDemand, Flags:= _
System.Security.Permissions.SecurityPermissionFlag.UnmanagedCode)> _
Protected Overrides Function ProcessDataGridViewKey( _
ByVal e As System.Windows.Forms.KeyEventArgs) As Boolean
' Handle the ENTER key as if it were a RIGHT ARROW key.
If e.KeyCode = Keys.Enter Then
Return Me.ProcessRightKey(e.KeyData)
End If
Return MyBase.ProcessDataGridViewKey(e)
End Function
End Class |
bon soiree.............et bon code..........
erreur designer dans designer
bonjour gilles
Pour l'erreur dans le Designer,ton form est abime suite à une erreur de manipulation car le code exact du designer pour un form genere normalement et non abime devrait etre le suivant comme tu peux t'en rendre compte en creant un nouveau form et en inspectant le code du designer :
Code:
1 2 3 4 5 6 7 8 9 10
|
'Form1
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(292, 266)
Me.Controls.Add(Me.MyCustomDataGridView1)
Me.Name = "Form1"
Me.Text = "Form1"
Me.ResumeLayout(False) |
Cela se produit quand on fait des manipulations incorrectes dans un projet et n' a rien à voir avec le CustomDataGridView.......
La solution c'est de repondre continuer au message et de recreer son form à zero.......
Maintenant excuse-moi tu as raison ,c'est bien remarque , on ne perds pas le "tab" effectivement ni la touche "home droite" mais on perds quand meme quelque chose comme toujours :
-tu ne peux plus avancer à la "verticale" avec "enter" surtout si la ligne dans le datagridview est ....longue avec beaucoup de champs....
En fait j'ai repondu trop vite par reflexe d'experience sachant que l'on gagne toujours un avantage au detriment d'un autre (ou de plusieurs) ....c'est tout dit et il faut savoir se compromettre parfois.....
Pour ce qui est du terme "Inherits" :signifie qu'on herite du controle DataGridView (ou aussi bien TextBox ,combobox...etc) c.à.d que notre controle sera un Sosie du controle DataGridView
Mais pourquoi un Sosie ? c'est inutile ,aurais-tu dit puisqu'on a deja le control DataGridView.
C'est là qu'intervient le terme "Overrides" qui veut dire "se substitue à" .
Mais il permet de modifier un comportement particulier -une methode ,une propriete par exemple du Sosie -en ecrivant du code dedans.
Ce code ecrit par nos soins annulera ce que fait cette methode par defaut (dans notre cas nous avons modifie 2 methodes ou sub et modifier le traitement par defaut de la touche Enter).
Notre controle est un sosie du DataGridView sauf pour ce qui est de la touche Enter que ......seul gilles connait. Tout autre s'y meprendrait...
Sans don ce code modifie rien ne sert d'heriter.
Cette facon de faire c'est qu'on appelle creer un controle personnalise...
Les methodes substituables sont nombreuse.
Il suffit de taper protected overrides dans CustomDataGridview pour voir leur liste dans l'intellisene......
Voila qui j'espere te donnera de l'appetit pour personnaliser tes controles..............
creer un control perso et heritage
bonjour gilles
L'erreur que tu as signalee vient de la facon de creer un controle perso.
Le designer n'aime pas cette facon de faire:
-creer un classe ,coller du code d'un control personnalise et generer.
Voici comment il faut procede dans les regles de l'art du designer:
1/Explor.Solution->Ajouter un Nouvel element->Window Form->Control Personnalise ->Ok
2/Taper sous classe "Inherits DataGridView(car par defaut il "inherits" plutot de Control), .
Un genre de Tooltips souligné apparait et si on clique dessus il nous dit voulez-vous modifier pour qu'il herite de datagridview .On repond oui.
3/
-Soit Renommer notre controle CustomDataGridView car l'auteur du code a renommer son controle et ses sub avec ce nom.....CustomDataGridView
-Soit laisser le nom CustomControl1 et plus bas dans une ligne en dessous vide:
-taper "Protected Overrides Process.... et choisir la procedure ProcessDialogKey dans intellissense et click...
-idem pour ProcessDataGridViewKey
-copier coller delicatement le code communique dans chaque procedure concernee....
-generer.................
Et voila comment travailler "proprement" avec le designer pour eviter au designer de "gueuler" et "warner".................
bon code........