Exception levée*: 'System.NullReferenceException' lors de l'appel à une méthode clear()
Bonjour,
Je rencontre un comportement étrange sur l'appel de la méthode Clear() sur un Tabcontrol.
Lors du démarrage de mon programme, dans le form_load, je reconstruit un TabControl en fct du niveau d'accès de l'utilisateur.
Pour cela :
- Je mémorise dans une liste les TabPages présentes par défaut (celles que j'ai crée avec le concepteur)
- J'efface mon Tabcontrol
- Puis je rajoute dans mon TabControl, les TabPages en fonction des droits d'accès de l'utilisateur
Cette séquence se déroule jusqu'au bout et j'obtiens au final ce que je souhaite.
Mais lorsque j'effectue l'étape 2 :
Code:
MonTab.TabPages.Clear()
j'ai systématiquement un message d'exception qui apparait dans la fenêtre Sortie.
Exception levée : 'System.NullReferenceException'
Pourquoi ?
Avant l'appel à la méthode Clear() mon TabControl n'est pas vide
Code:
1 2 3 4 5 6 7 8 9
| Debug.WriteLine(MonTab.TabCount.ToString & " TabPages")
Try
MonTab.TabPages.Clear()
Catch ex As Exception
Debug.WriteLine("Message :" & ex.Message)
End Try
' J'obtient ceci :
' 2 TabPages
' Exception levée : 'System.NullReferenceException' |
J'ai mis un point d'arrêt dans le catch et apparemment, je n'y passe pas.
Pourtant, dans ma fenêtre Sortie, j'ai bien un message d'exception qui apparait... :weird:
Inutile de citer le message précédant, cela alourdit la lecture.
Aie !
J'ai essayé de faire un petit bout de code simple en exemple pour mettre en évidence le pb et…
Je n'arrive pas à reproduire l'exception… :fou:
cela veut dire que je suis passé à côté de quelque chose… :?
En fait, mon problème apparait dès le form_load :
Dans celui-ci, j'initialise les droits de l'utilisateur au plus bas niveau. Donc je vais virer par exemple, les TabPages "critiques" que j'ai défini à l'aide du concepteur.
Voilà mon exemple… qui malheureusement fonctionne :mouarf:
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
|
Public Class Form1
Private MonTab As New TabControl
Private BtnClr As New Button
Private MemoTabPage As New Generic.List(Of TabPage)
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
MonTab.Dock = DockStyle.Fill
For i = 1 To 4
MonTab.TabPages.Add("Essai " & i.ToString)
Next i
Me.Controls.Add(MonTab)
CreateCtrl()
BtnClr.Dock = DockStyle.Left
BtnClr.Text = "Clear"
Me.Controls.Add(BtnClr)
For Each p As TabPage In MonTab.TabPages
MemoTabPage.Add(p)
Next
AddHandler BtnClr.Click, AddressOf Btn_Click
RafrMonTab()
End Sub
Private Sub CreateCtrl()
For Each page As TabPage In MonTab.TabPages
Dim btn As Button
Dim txt As TextBox
Dim h As Integer
For i = 1 To 10
btn = New Button
btn.Text = "Bouton " + (i + (page.TabIndex * 10)).ToString
h = 15 + (btn.Height * i)
btn.Location = New Point(15, h)
txt = New TextBox
txt.Location = New Point(30 + btn.Width, h)
page.Controls.AddRange(New Control() {btn, txt})
Next
Next
End Sub
Private Sub RafrMonTab()
MonTab.TabPages.Clear() ' <==== C'est ICI que j'obtiens mon exception
' Pour l'exemple je recopie tout mais en réalité il y a un filtrage suivant les droits d'accès.
For Each p As TabPage In MemoTabPage
MonTab.TabPages.Add(p)
Next
End Sub
Private Sub Btn_Click(sender As Object, e As EventArgs)
RafrMonTab()
End Sub
End Class |