Hello,
Je suis en train de devenir fou et ne sais plus où chercher la cause de ce comportement étrange...
Dans un formulaire, j'ai un TabControl avec 2 TabPages qui contiennent chacun un DataGridView et chaque DataGridView contient une DataGridViewCheckBoxColumn. Dans le premier datagridview, je peux la cocher via la code. Dans le second, pas moyen... C'est pourtant le même code partout (ou alors il est temps que j'aille chez l'opthalmo...).
Voici la définition du TabControl, de ces TabPages et des DataGridView :
Mis à part les noms et les tabindex, je ne vois aucune différence entre les 2 TabPages ni entre les deux DataGridView.
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
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 ' 'tcPromoDetail ' Me.tcPromoDetail.Controls.Add(Me.tpDemo) Me.tcPromoDetail.Controls.Add(Me.tpOwn) Me.tcPromoDetail.Dock = System.Windows.Forms.DockStyle.Fill Me.tcPromoDetail.Location = New System.Drawing.Point(0, 184) Me.tcPromoDetail.Name = "tcPromoDetail" Me.tcPromoDetail.SelectedIndex = 0 Me.tcPromoDetail.Size = New System.Drawing.Size(1004, 434) Me.tcPromoDetail.TabIndex = 6 ' 'tpDemo ' Me.tpDemo.Controls.Add(Me.dgvPromoDetailDemo) Me.tpDemo.Controls.Add(Me.tlpDemo) Me.tpDemo.Location = New System.Drawing.Point(4, 22) Me.tpDemo.Name = "tpDemo" Me.tpDemo.Padding = New System.Windows.Forms.Padding(3) Me.tpDemo.Size = New System.Drawing.Size(996, 408) Me.tpDemo.TabIndex = 0 Me.tpDemo.Text = "Demo" Me.tpDemo.UseVisualStyleBackColor = True ' 'tpOwn ' Me.tpOwn.Controls.Add(Me.dgvPromoDetailOwn) Me.tpOwn.Controls.Add(Me.tcOwn) Me.tpOwn.Controls.Add(Me.tlpOwn) Me.tpOwn.Location = New System.Drawing.Point(4, 22) Me.tpOwn.Name = "tpOwn" Me.tpOwn.Padding = New System.Windows.Forms.Padding(3) Me.tpOwn.Size = New System.Drawing.Size(996, 408) Me.tpOwn.TabIndex = 1 Me.tpOwn.Text = "Own" Me.tpOwn.UseVisualStyleBackColor = True ' 'dgvPromoDetailDemo ' Me.dgvPromoDetailDemo.AllowUserToAddRows = False Me.dgvPromoDetailDemo.AllowUserToDeleteRows = False Me.dgvPromoDetailDemo.AllowUserToResizeRows = False DataGridViewCellStyle1.BackColor = System.Drawing.Color.FromArgb(CType(CType(192, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) Me.dgvPromoDetailDemo.AlternatingRowsDefaultCellStyle = DataGridViewCellStyle1 Me.dgvPromoDetailDemo.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize Me.dgvPromoDetailDemo.Dock = System.Windows.Forms.DockStyle.Fill Me.dgvPromoDetailDemo.Location = New System.Drawing.Point(3, 38) Me.dgvPromoDetailDemo.Name = "dgvPromoDetailDemo" Me.dgvPromoDetailDemo.ReadOnly = True Me.dgvPromoDetailDemo.RowHeadersVisible = False Me.dgvPromoDetailDemo.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect Me.dgvPromoDetailDemo.Size = New System.Drawing.Size(990, 367) Me.dgvPromoDetailDemo.TabIndex = 0 ' 'dgvPromoDetailOwn ' Me.dgvPromoDetailOwn.AllowUserToAddRows = False Me.dgvPromoDetailOwn.AllowUserToDeleteRows = False Me.dgvPromoDetailOwn.AllowUserToResizeRows = False DataGridViewCellStyle2.BackColor = System.Drawing.Color.FromArgb(CType(CType(192, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer)) Me.dgvPromoDetailOwn.AlternatingRowsDefaultCellStyle = DataGridViewCellStyle2 Me.dgvPromoDetailOwn.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize Me.dgvPromoDetailOwn.Dock = System.Windows.Forms.DockStyle.Fill Me.dgvPromoDetailOwn.Location = New System.Drawing.Point(3, 38) Me.dgvPromoDetailOwn.Name = "dgvPromoDetailOwn" Me.dgvPromoDetailOwn.ReadOnly = True Me.dgvPromoDetailOwn.RowHeadersVisible = False Me.dgvPromoDetailOwn.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect Me.dgvPromoDetailOwn.Size = New System.Drawing.Size(990, 367) Me.dgvPromoDetailOwn.TabIndex = 1
Voici comment les colonnes sont ajoutées aux DataGridView :
Là encore aucune différence. Bien sûr, toutes les colonnes ne sont pas identiques (sinon autant faire une seule grille) mais la colonne qui pose problème (vers la fin dans les 2 sub) nommée "dgvcEncoded" est créée pareil pour les deux au caractère près.
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
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114 Private Sub InitDgvDemo() dgvPromoDetailDemo.AutoGenerateColumns = False dgvPromoDetailDemo.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill Dim index As Integer With dgvPromoDetailDemo.Columns index = .Add("dgvcId", "Id") .Item(index).DataPropertyName = "Id" .Item(index).Visible = False index = .Add("dgvcCodeDemo", "Code") .Item(index).DataPropertyName = "CodeDemo" index = .Add("dgvcDemoName", "Name") .Item(index).DataPropertyName = "DemoName" index = .Add("dgvcVbn", "VBN") .Item(index).DataPropertyName = "Vbn" index = .Add("dgvcPercentage", "Percentage") .Item(index).DataPropertyName = "Percentage" index = .Add("dgvcPercentType", "Type") .Item(index).DataPropertyName = "PercentType" index = .Add("dgvcDesc", "Description") .Item(index).DataPropertyName = "Description" index = .Add("dgvcNote", "Note") .Item(index).DataPropertyName = "Note" index = .Add("dgvcBuyingDept", "Buying Dept.") .Item(index).DataPropertyName = "BuyingDepartment" index = .Add("dgvcListType", "Type of list") .Item(index).DataPropertyName = "ListType" index = .Add("dgvcProductCount", "Product Count") .Item(index).DataPropertyName = "ProductCount" Dim col As New DataGridViewCheckBoxColumn() col.Name = "dgvcEncoded" col.HeaderText = "Encoded" index = .Add(col) .Item(index).DataPropertyName = "Encoded" Dim btnColumn As New DataGridViewDisableButtonColumn btnColumn.Name = "dgvcBrowse" btnColumn.HeaderText = "" btnColumn.Text = "Get List" btnColumn.UseColumnTextForButtonValue = True .Add(btnColumn) End With End Sub Private Sub InitDgvOwn() dgvPromoDetailOwn.AutoGenerateColumns = False dgvPromoDetailOwn.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill Dim index As Integer With dgvPromoDetailOwn.Columns index = .Add("dgvcId", "Id") .Item(index).DataPropertyName = "Id" .Item(index).Visible = False index = .Add("dgvcDepartment", "Department") .Item(index).DataPropertyName = "Department" index = .Add("dgvcBrand", "Brand") .Item(index).DataPropertyName = "Brand" index = .Add("dgvcBrand", "Brand") .Item(index).DataPropertyName = "BrandName" index = .Add("dgvcPercentage", "Percentage") .Item(index).DataPropertyName = "Percentage" index = .Add("dgvcPercentType", "Type") .Item(index).DataPropertyName = "PercentType" index = .Add("dgvcComment", "Description") .Item(index).DataPropertyName = "Description" index = .Add("dgvcNote", "Note") .Item(index).DataPropertyName = "Note" index = .Add("dgvcSeasons", "Seasons") .Item(index).DataPropertyName = "SeasonsRange" index = .Add("dgvcBuyingDept", "Buying Dept.") .Item(index).DataPropertyName = "BuyingDepartment" index = .Add("dgvcListType", "Type of list") .Item(index).DataPropertyName = "ListType" index = .Add("dgvcProductCount", "Product Count") .Item(index).DataPropertyName = "ProductCount" Dim col As New DataGridViewCheckBoxColumn() col.Name = "dgvcEncoded" col.HeaderText = "Encoded" index = .Add(col) .Item(index).DataPropertyName = "Encoded" Dim btnColumn As New DataGridViewDisableButtonColumn btnColumn.Name = "dgvcBrowse" btnColumn.HeaderText = "" btnColumn.Text = "Get List" btnColumn.UseColumnTextForButtonValue = True .Add(btnColumn) End With End Sub
Et pour finir, voici ce qu'il se passe lorsqu'un utilisateur double-clique sur cette case (me demandez pas pourquoi il faut que ce soit un double-clique et pourquoi pas plutôt simplement autoriser l'édition du DGV pour voir cocher la case normalement, c'est comme ça que cela a été demandé) :
Là encore, à part le nom du dgv, rien ne change non plus. Pourtant, en mode pas à pas, si je mets le curseur de la souris sur la propriété Value de la dernière ligne de la sub alors que le curseur de debug est sur le sur end sub, dans le premier cas, je vois que la valeur est bien passée à True mais dans le second, elle reste sur False...
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 Private Sub dgvPromoDetailDemo_CellDoubleClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgvPromoDetailDemo.CellDoubleClick If e.RowIndex < 0 OrElse Not e.ColumnIndex = dgvPromoDetailDemo.Columns("dgvcEncoded").Index OrElse CBool(dgvPromoDetailDemo.Rows(e.RowIndex).Cells("dgvcEncoded").Value) = True OrElse Not Promo.DTO.IsDemoEncoded OrElse dgvPromoDetailDemo.SelectedRows.Count > 1 Then Exit Sub End If dtd.FlagAsEncoded() dgvPromoDetailDemo.Rows(e.RowIndex).Cells("dgvcEncoded").Value = True End Sub Private Sub dgvPromoDetailOwn_CellDoubleClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgvPromoDetailOwn.CellDoubleClick If e.RowIndex < 0 OrElse Not e.ColumnIndex = dgvPromoDetailOwn.Columns("dgvcEncoded").Index OrElse CBool(dgvPromoDetailOwn.Rows(e.RowIndex).Cells("dgvcEncoded").Value) = True OrElse Not Promo.DTO.IsOwnEncoded OrElse dgvPromoDetailOwn.SelectedRows.Count > 1 Then Exit Sub End If dto.FlagAsEncoded() dgvPromoDetailOwn.Rows(e.RowIndex).Cells("dgvcEncoded").Value = True End Sub
Je ne sais plus quoi vérifier d'autre à part tout ce que je viens de mettre ici. Quelqu'un aurait-il une idée ??
Partager