Developpez.com

Télécharger gratuitement le magazine des développeurs, le bimestriel des développeurs avec une sélection des meilleurs tutoriels

FAQ VB.NETConsultez toutes les FAQ

Nombre d'auteurs : 36, nombre de questions : 239, dernière mise à jour : 24 mai 2015  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.


SommaireWinFormsDatagrid (10)
précédent sommaire suivant
 

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)

Mis à jour le 30 octobre 2013 abelman

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

Mis à jour le 30 novembre 2013 neguib

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"
La titre dans la colonne sera bien celui assigné, et on n'a pas touché à la structure interne de la table.

Mis à jour le 30 octobre 2013 crjo

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)
Astuce : en gardant une référence sur le style de colonne supprimée (hiddenColStyle), on peut par la suite décider de ré-afficher la colonne. Cette technique est utile si on veut choisir dynamiquement les colonnes à afficher.
Code vb.net : Sélectionner tout
tableStyle.GridColumnStyles.Add(hiddenColStyle)

Mis à jour le 30 octobre 2013 crjo

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
Utilisable par exemple ainsi :

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

Mis à jour le 30 novembre 2013 neguib

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
Utilisable par exemple ainsi sur une modification DataGrid.DataSource :

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
Cet exemple peut être bien évidemment amélioré, si l'on souhaite également répercuter de façon dynamique des ajouts ou suppressions de lignes.

Mis à jour le 30 octobre 2013 neguib

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
Utilisable par exemple ainsi :

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

Mis à jour le 30 octobre 2013 neguib

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

Mis à jour le 30 octobre 2013 HULK

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

Mis à jour le 30 octobre 2013 neguib

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
Dans l'évènement clic d'un bouton, nous pouvons mettre :

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)

Mis à jour le 30 octobre 2013 HULK

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 ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les 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 © 2017 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.

 
Responsable bénévole de la rubrique Microsoft DotNET : Hinault Romaric -