FAQ VB.NETConsultez toutes les FAQ
Nombre d'auteurs : 37, nombre de questions : 240, dernière mise à jour : 12 mai 2018 Ajouter une question
Cette FAQ a été réalisée pour répondre aux questions les plus fréquemment posées sur le forum Développement DotNET
Je tiens à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle contient sont correctes. Les auteurs font le maximum, mais l'erreur est humaine. Si vous trouvez une erreur, ou que vous souhaitez devenir rédacteur, lisez ceci.
Sur ce, je vous souhaite une bonne lecture.
- Comment sélectionner via le code une ligne d'un DataGrid ?
- Comment sélectionner toute la ligne lors d'un clic dans une cellule ?
- Comment renommer une colonne de DataGrid ?
- Comment masquer une colonne de DataGrid ?
- Comment identifier la partie du DataGrid sur laquelle on a cliqué ?
- Comment obtenir le nombre de lignes du DataGrid par son BindingContext ?
- Comment implémenter l'évènement CurrentRowChanged du DataGrid ?
- Comment transférer un DataGrid dans Excel ?
- Comment modifier la hauteur des lignes du DataGrid ?
- Comment connaître les lignes supprimées, ajoutées, modifiées remplies par un dataset ?
Il suffit simplement d'utiliser une méthode native des DataGrid :
(On suppose que MyDG est un DataGrid fonctionnel et Num_Row un Entier contenant l'index de la colonne)
Code vb.net : | Sélectionner tout |
MyDG.Select(Num_Row)
La Classe System.Windows.Forms.DataGrid.HitTestInfo vous permet de déterminer la partie d'un contrôle DataGrid sur laquelle l'utilisateur a cliqué. Pour se faire, vous avez besoin d'utiliser la méthode HitTest du Datagrid que nous nommons ici pour l'exemple « DG » :
Code vb.net : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | Imports System Imports System.Drawing Imports System.Windows.Forms ' ... Private Sub DG_MouseUp(ByVal sender As Object, ByVal e As MouseEventArgs) Handles DG.MouseUp ' Récupérer les coordonnées de la souris Dim p = New Point(e.X, e.Y) ' Déterminer la partie cliquée du datagrid Dim HTI As DataGrid.HitTestInfo = DG.HitTest(p) ' Si c'est un type 'cellule' If (HTI.Type = DataGrid.HitTestType.Cell) Then ' Définir la cellule en cours DG.CurrentCell = New DataGridCell(HTI.Row, HTI.Column) ' Sélectionner la ligne correspondante DG.Select(HTI.Row) End If End Sub |
On suppose que le DataGrid est associé à une DataTable. Il faut faire les actions suivantes : 1. créer un DataGridTableStyle pour la table en question 2. ajouter le style au DataGrid 3. renommer la propriété HeaderText du style de colonne (DataGridColumnStyle) correspondant.
Code vb.net : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | ' table est une DataTable dataGrid1.DataSource = table ' On crée une table de style qui permettra de renommer les colonnes. Dim tableStyle As DataGridTableStyle = New DataGridTableStyle ' IMPORTANT: il faut associer le nom de la table au style tableStyle.MappingName = table.TableName ' En ajoutant le style au DataGrid, les DataGridColumnStyle sont automatiquement créés ' En fonction de la table spécifiée par tableStyle.MappingName dataGrid1.TableStyles.Add(tableStyle) ' On suppose que la table contient une colonne nommée "col_name" tableStyle.GridColumnStyles("col_name").HeaderText = "colonne renommée pour datagrid" |
On suppose que le DataGrid est associé à une DataTable. Il faut faire les actions suivantes :
- créer un DataGridTableStyle pour la table en question ;
- ajouter le style au DataGrid ;
- personnaliser le style pour retirer le style de colonne (DataGridColumnStyle) correspondant.
Code vb.net : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | ' table est de type : DataTable dataGrid1.DataSource = table ' On crée une table de style qui permettra de masquer une ou plusieurs colonnes. Dim tableStyle As DataGridTableStyle = New DataGridTableStyle ' IMPORTANT: il faut associer le nom de la table au style tableStyle.MappingName = table.TableName ' En ajoutant le style au DataGrid, celui-ci va automatiquement utiliser le style ' pour afficher la table associé (c'est pour ça qu'il est important ' d'assigner MappingName) dataGrid1.TableStyles.Add(tableStyle) ' On suppose que la table contient une colonne nommée "hidden" ' On définit une référence sur la colonne que l'on veut cacher Dim hiddenColStyle As DataGridColumnStyle = tableStyle.GridColumnStyles("hidden") ' En enlevant la colonne des styles de colonne, la colonne n'apparaîtra ' plus dans le DataGrid. tableStyle.GridColumnStyles.Remove(hiddenColStyle) |
Code vb.net : | Sélectionner tout |
tableStyle.GridColumnStyles.Add(hiddenColStyle)
La Classe DataGrid.HitTestInfo vous permet de déterminer la partie d'un contrôle DataGrid sur laquelle l'utilisateur a cliqué. Pour se faire, il nous faut :
- Déterminer les coordonnées du click par la méthode HitTest ;
- Utiliser la propriété HitTestInfo.Type, qui renvoie une valeur de l'énumération DataGrid.HitTestType.
Nous implémenterons une classe MonDataGrid dérivée de DataGrid capable d'exposer par un accesseur sa partie cliquée.
Code vb.net : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | ' ... Public Class MonDataGrid Inherits DataGrid ' ... 'accesseur publique qui obtient la partie cliquée Public ReadOnly Property ClickType() As DataGrid.HitTestType Get Return Me.currentClickType End Get End Property Private currentClickType As DataGrid.HitTestType ' Surcharge de MyBase.OnMouseDown Protected Overloads Overrides Sub OnMouseDown(ByVal e As MouseEventArgs) Me.currentClickType = Me.HitTest(e.X, e.Y).Type MyBase.OnMouseDown(e) End Sub End Class |
Code vb.net : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 | Imports System.Text Imports System.Windows.Forms ' ... Private Sub DataGrid1MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Dim dg As MonDataGrid = CType(sender, MonDataGrid) Dim sb As StringBuilder = New StringBuilder("La partie cliquée est de type: ") sb.Append(dg.ClickType.ToString) dg.CaptionText = sb.ToString() End Sub |
La propriété DataGrid.BindingContext permet d'accéder à l'indexeur de l'objet BindingManagerBase sous-jascent. Et par la même, permet d'atteindre sa propriété BindingManagerBase.Count.
Pour la démonstration, nous implémentons notre propre classe MonDataGrid dérivée de DataGrid.
Code vb.net : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | ' ... Public Class MonDataGrid Inherits DataGrid ' ... ' Accesseur publique qui obtient le nombre de lignes Public ReadOnly Property DataRowsCount() As Integer Get Return Me.currentDataRowsCount End Get End Property Private currentDataRowsCount As Integer ' Surcharge de MyBase.OnDataSourceChanged Protected Overloads Overrides Sub OnDataSourceChanged(ByVal e As System.EventArgs) If Not (Me.DataSource Is Nothing) Then Me.currentDataRowsCount = Me.BindingContext(Me.DataSource, Me.DataMember).Count Else : Me.currentDataRowsCount = 0 End If MyBase.OnDataSourceChanged(e) End Sub End Class |
Code vb.net : | Sélectionner tout |
1 2 3 4 5 6 7 | Imports System.Text ' ... Private Sub DataGrid1DataSourceChanged(ByVal sender As Object, ByVal e As EventArgs) Dim sb As StringBuilder = New StringBuilder("Le nombre de lignes est de: ") sb.Append(CType(sender, MonDataGrid).DataRowsCount.ToString()) Me.LComment.Text = sb.ToString() End Sub |
La classe DataGrid possède nativement que l'évènement CurrentCellChanged pour signaler le changement de cellule. Il nous faut donc simplement lors de cet évènement comparer la ligne à laquelle correspond la cellule avec un champ privé représentant la ligne précédemment sélectionnée. Ainsi nous pouvons déclencher un nouvel évènement que nous appelons CurrentRowChanged à partir de la surcharge de la méthode DataGrid.OnCurrentCellChanged.
Nous implémenterons une classe MonDataGrid dérivée de DataGrid capable de déclencher un évènement CurrentRowChanged pour signaler la ligne ayant actuellement le focus et, par là même, distinguer celle correspondant à l'ajout d'un enregistrement.
Code vb.net : | Sélectionner tout |
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 | Option Explicit On Option Strict On Imports System Imports System.Drawing; Imports System.Reflection Imports System.Windows.Forms Public Class MonDataGrid Inherits DataGrid Public Event CurrentRowChanged As EventHandler Public Sub New() MyBase.New Me.currentRowIndex = -1 End Sub ' ... ' Accesseur publique qui obtient l'index de la ligne courante Public ReadOnly Property CurrentRow() As Integer Get Return Me.currentRowIndex End Get End Property Private currentRowIndex As Integer ' Surcharge de de la méthode MyBase.OnCurrentCellChanged Protected Overloads Overrides Sub OnCurrentCellChanged(ByVal e As EventArgs) MyBase.OnCurrentCellChanged(e) If Not (Me.CurrentCell.RowNumber = Me.currentRowIndex) Then Me.currentRowIndex = Me.CurrentCell.RowNumber Me.OnCurrentRowChanged(e) End If End Sub ' Déclenche l'évènement CurrentRowChanged Protected Overridable Sub OnCurrentRowChanged(ByVal e As EventArgs) RaiseEvent CurrentRowChanged(Me, e) End Sub End Class |
Code vb.net : | Sélectionner tout |
1 2 3 4 5 6 7 8 | Private Sub DataGrid1CurrentRowChanged(ByVal sender As Object, ByVal e As EventArgs) Dim dg As MonDataGrid = CType(sender, MonDataGrid) Dim rowindex As Integer = dg.CurrentRow If rowindex = CType(dg.DataSource, DataTable).Rows.Count Then Me.LComment.Text = "Vous êtes sur la ligne d'ajout d'enregistrement" Else : Me.LComment.Text = "ligne " + rowindex.ToString() End If End Sub |
Ce code représente une façon d'exporter des données présentes dans un DataGrid dans une feuille Excel. Chaque cellule de DataGrid est parcourue et transférer dans une cellule du document Excel. Ce code est recommandé pour un volume de données non excessif dans le DataGrid.
Ce code suppose que vous ayez rempli au préalable le datagrid nommé « DataGrid1 » avec un DataSet nommé « ds » contenant une DataTable nommée « da ».
L'ajout de la référence « Microsoft Excel 11.0 Object Library » est nécessaire
Code vb.net : | Sélectionner tout |
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 | Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet xlApp = CType(CreateObject("Excel.Application"), Excel.Application) xlBook = CType(xlApp.Workbooks.Add, Excel.Workbook) xlSheet = CType(xlBook.Worksheets(1), Excel.Worksheet) ' Ici on compte le nombre de lignes et de colonnes du datatable Dim nbrLigne As Integer = ds.Tables("da").Rows.Count - 1 Dim nbrColon As Integer = ds.Tables("da").Columns.Count - 1 Dim x, y As Integer For x = 0 To nbrColon ' Ici on prend le titre des colonnes du datatable xlSheet.Cells(1, x + 1) = ds.Tables("da").Columns(x).ColumnName ' On met la première ligne en gras xlSheet.Rows(1).Font.Bold = True ' Pour chaque colonne et chaque ligne on transfère les données For y = 0 To nbrLigne xlSheet.Cells(y + 2, x + 1) = DataGrid1.Item(y, x) Next Next ' Ici on affiche les résultats dans Excel xlSheet.Application.Visible = True ' On peut sauvegarder notre document sur le disque xlSheet.SaveAs("C:\nom_document.xls") ' On quitte l'application et on détruit les objets xlApp.Quit() xlSheet = Nothing xlBook = Nothing xlApp = Nothing |
Ici, le souci à résoudre est que l'accesseur DataGrid. DataGridRows est déclaré Friend.
Cette propriété expose le tableau des objets DataGridRow, elle même classe Friend de System.Windows.Forms. Pour atteindre sa propriété Height, il y a tout de même une solution qui passe par les fonctionnalités de System.Windows.Reflection.
Pour la démonstration, nous implémentons notre propre classe MonDataGrid dérivée de DataGrid.
Code vb.net : | Sélectionner tout |
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 | Option Explicit On Option Strict On Imports System Imports System.Reflection Imports System.Windows.Forms Public Class MonDataGrid Inherits DataGrid Public Sub New() MyBase.New End Sub Public Sub setRowHeight(ByVal rowindex As Integer, ByVal rowheight As Integer) Dim rows() As Object = GetRows() If rowindex < 0 Then For Each row As Object In rows setHeight(row, rowheight) Next Else : setHeight(rows(rowindex), rowheight) End If End Sub Private Function GetRows() As Object() Dim bf As BindingFlags = BindingFlags.Instance Or BindingFlags.NonPublic Dim t As Type = Me.GetType.BaseType Dim mi As MethodInfo = t.GetMethod("get_DataGridRows", bf) Return CType((mi.Invoke(Me, Nothing)), Object()) End Function Private Sub setHeight(ByVal row As Object, ByVal rowheight As Integer) row.GetType().GetProperty("Height").SetValue(row, rowheight, Nothing) End Sub End Class |
Ce code permets de détecter les valeurs de lignes d'un DataGrid qui ont été modifiées, supprimées ou ajoutées par l'utilisateur.
On suppose ici que l'on rempli le DataGrid avec un DataSet et un SqlDataAdapter. La requête SELECT du DataAdapter contient deux champs, nous avons donc la requête du type :
Code sql : | Sélectionner tout |
SELECT Champ1, Champ2 FROM Table
Code vb.net : | Sélectionner tout |
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 | ' Représente une ligne de données dans un datatable Dim dr As DataRow ' Variable string pour récupérer nos résultats Dim ligneModif, ligneSupp, ligneAjout As String Dim result As String ' Nous allons parcourir chaque ligne de notre DataTable For Each dr In DataSet.Tables("DataTable").Rows ' Selon l'état de la ligne Select Case dr.RowState ' Ligne modifiée Case DataRowState.Modified ' dr(0) récupère la valeur de la première colonne ' DataRowVersion.Original récupère la valeur avant la modification ligneModif = ligneModif & dr(0, DataRowVersion.Original) & "-" & dr(1, _ DataRowVersion.Original) & vbCrLf ' Ligne supprimée Case DataRowState.Deleted ligneSupp = ligneSupp & dr(0, DataRowVersion.Original) & "-" & dr(1, _ DataRowVersion.Original) & vbCrLf ' Ligne ajoutée Case DataRowState.Added ligneAjout = ligneAjout & dr(0) & "-" & dr(1) & vbCrLf End Select Next result = "ligne(s) modifiée(s) : " & vbCrLf & ligneModif & vbCrLf & "ligne(s) _ supprimée(s) : " & vbCrLf & ligneSupp & vbCrLf & "Ligne(s) ajoutée(s) :" & vbCrLf & ligneAjout MessageBox.Show(result) |
Proposer une nouvelle réponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour çaLes sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.