Bonjour à tous, Salut olsimare,
Comment faire pour modifier (par code) le type d'une colonne dans un DtGridView, une fois qu'il est créé et rempli ?
Merci à tous.
Bonjour à tous, Salut olsimare,
Comment faire pour modifier (par code) le type d'une colonne dans un DtGridView, une fois qu'il est créé et rempli ?
Merci à tous.
Pour préciser ma question, il s'agirait de récupérer dans un dataGridView les données depuis une datatable pour des questions de rapidité :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 Public Sub Remplissage() Dim sr = New StreamReader(Main.strPath & "Colonnes.txt", System.Text.Encoding.Default) Do Until sr.Peek = -1 Str = sr.ReadLine() Dim c0 = New DataColumn(Str) dtbl.Columns.Add(c0) Loop sr.Close() Dim sr = New StreamReader(StrFile, System.Text.Encoding.Default) Do Until sr.Peek = -1 Str = sr.ReadLine() Main.SubChaine = Str.Split(Main.Delim) dtbl.Rows.Add(Main.SubChaine) Loop DGV.DataSource = dtbl End Sub
Sauf que je dois affecter à ce dataGridView des colonnes particulières :
Je me sens donc obliger de remplir ma DGV comme ca :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 Public Sub Colonnes() Dim sr = New StreamReader(Main.strPath & "Colonnes.txt", System.Text.Encoding.Default) Do Until sr.Peek = -1 Str = sr.ReadLine() Dim c1 As New FormulaDGVColumn c1.HeaderText = Str Me.DGV.Columns.Add(c1) Loop sr.Close() End Sub
Comment mélanger les 2 méthodes (Colonnes Perso + Données depuis une DataTable ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Dim sr = New StreamReader(StrFile, System.Text.Encoding.Default) Do Until sr.Peek = -1 Str = sr.ReadLine() SubChaine = Str.Split(";") Me.DGV.Rows.Add(SubChaine) Loop sr.Close()
Merci.
Re.
Tu dois déclarer les colonnes de ton DGV avant d'alimenter le datasource (il n'est pas possible de changer le type d'une colonne existante) et positionner le datagridview.AutoGenerateColumns à False.
Ensuite, tu dois faire pour chaque colonne le bind avec la source comme ceci :
Cdt.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2Tacolonne.DataPropertyName = "LeNomDeLaColonneEnDatatable"
Bon à savoir : la touche F1 ne sert pas à commander des places pour le grand prix de Belgique.
Merci Olsimare, ca fonctionne.
Seul soucis, comme mes colonnes personnalisées (que tu connais) contiennent des cellules personnalisées ayant une fonction :
Du coup, au lancement le DGV qui contient bien les données n'affiche que la première ligne (car le pointeur par défaut se trouve en cellule (0,0) et active une seul fois cette même fonction.)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Protected Overrides Function GetFormattedValue(ByVal value As Object, ByVal rowIndex As Integer, _ ByRef cellStyle As DataGridViewCellStyle, ByVal valueTypeConverter As System.ComponentModel.TypeConverter, _ ByVal formattedValueTypeConverter As System.ComponentModel.TypeConverter, ByVal context As DataGridViewDataErrorContexts) As Object ... End Function
Il faudrait donc contourner cette fonction juste au lancement...
Cdt.
Bonjour.
Oui, enfin je les connais pas plus que ça ! Comme les autres lecteurs de ce post d'ailleurs (faut pas oublier que c'est un forum ).
Je ne vois pas pourquoi ça ne fonctionnerait pas et je ne comprends pas cette histoire de pointeur. Qu'obtiens tu exactement ? Une seule ligne affichée ou plusieurs lignes dont seule la prémiére est alimentée correctement ?
Cdt.
Bon à savoir : la touche F1 ne sert pas à commander des places pour le grand prix de Belgique.
Le DataGridView est bien rempli mais seule la première ligne est affichée.
Je sais qu'il est rempli car dès que je clique sur une cellule "vide" son contenu s'affiche.
Ce phénomène provient de la fonction que je mentionnais :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 Protected Overrides Function GetFormattedValue(ByVal value As Object, ByVal rowIndex As Integer, _ ByRef cellStyle As DataGridViewCellStyle, ByVal valueTypeConverter As System.ComponentModel.TypeConverter, _ ByVal formattedValueTypeConverter As System.ComponentModel.TypeConverter, ByVal context As DataGridViewDataErrorContexts) As Object If Me.RowIndex < 0 Then Return Nothing End If Dim s As String = CStr(Me.Value) 'Hors Saisie Formule If DocSaisie.boolFormula Then Return s End If If s = Nothing Then Return Nothing End If If s = "=" Then Return s End If If s.StartsWith("=") Then 'Appel de la Fonction AttribVal() Dim StrCal As String = AttribVal(s, Me.RowIndex) Dim Evl As New Eval3.Evaluator Try Return CStr(Evl.Parse(StrCal).value) 'Si Attribution de Valeur Impossible : Cellule Cible = Vide Catch ex As Exception Me.Value = "" MessageBox.Show("Formule erronée.") Return Nothing End Try Else Return s End If End Function
car si je la masque tout s'affiche normalement.
Je pense que la première ligne est visible à cause de la cellule (0,0) qui est automatiquement (par défaut) sélectionnée au lancement du DGV.
Il déclenche la sélection des autres cellules de la ligne (c'est ne fonction que j'ai faite) et ces sélections appellent la fonction ci-jointe qui retoune s.
Comment faire ?
Merci.
Bonjour.
Peut-être qu'en remplaçant :
Par :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Dim s As String = CStr(Me.Value)
Le Me.Value n'est peut être pas encore positionné d'où la tentative de prendre celui passé en paramétre.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Dim s As String = CStr(value)
Cdt.
Bon à savoir : la touche F1 ne sert pas à commander des places pour le grand prix de Belgique.
Non, le problème ne vient pas de là.
Il vient du fait qu'au moment où je transfère la dataTable au DGV :
Cela n'appelle pas la fonction "GetFormattedValue", du coup aucun affichage n'a lieu.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Me.DGV.DataSource = TblDGV
Si la première ligne est affichée, un fois encore, c'est simplement parce que le curseur se positionne par défaut sur cette ligne et déclenche, lui, cette fonction.
La fonction marche bien, mais ne fonctionne que cellule à cellule, pas pour tout un DGV.
Pour l'instant, pour contourner le problème, après l'affichage du formulaire j'active la 1ère cellule de chaque ligne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 .DocActif.Show() For A As Integer = 0 To DocActif.DGV.RowCount - 1 .DocActif.DGV.Item(0, A).Selected = True .DocActif.DGV.Item(0, A).Selected = False Next
...
Bonjour.
Et avec :
Ca devrait le faire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Me.DGV.DataSource = TblDGV Me.DGV.Refresh
Cdt.
Bon à savoir : la touche F1 ne sert pas à commander des places pour le grand prix de Belgique.
Bonjour,
Non, ca ne marche pas (j'avais essayé).
En fait Refresh() n'appelle pas la fonction GetFormatedValue.
La seule chose à faire si c'est possible c'est de ne pas passer (au chargement) par cette fonction, de l'éviter (si je la commente, cela fonctionne.)
Merci, Merci.
Bon, j'ai fini par la jouer comme ca :
dans la fonction GetFormattedValue :
Dans le formulaire DocSaisie qui contient le DGV :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 'Pour désactiver momentanéement GetFormattedVakue If DocSaisie.BoolDesAct = False Then Return value End If
Je laisse ce post encore une journée si qqn a une meilleure idée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 'Pour que la GetFormattedValue soit réactivée : Private Sub DGV_CellClick... BoolDesAct = True End Sub
Encore merci.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager