2017-08-30 6 views
1

Je veux dessiner TextBoxes/Labels sur mon formulaire en code et les connecter avec des lignes - sur la base des données que j'ai stockées dans un datatable ("treedata") . Si j'utilise le code suivant tout fonctionne bien:System.Drawing.Pen - les lignes disparaissent lorsque les étiquettes sont placées sur le formulaire

For i = 0 To treedata.Rows.Count - 1 

     Dim tb As New TextBox 

     hor = treedata.Rows(i)(11) 
     vern = ver + 120 * treedata.Rows(i)(4) 

     tb.Text = "sometext" 
     tb.Location = New Point(hor, vern) 

     Form8.Controls.Add(tb) 

     posofmodif = treedata.Rows(i)(10) 
     vero = treedata.Rows(i)(6) 

     Dim myPen As New System.Drawing.Pen(System.Drawing.Color.Green) 
     Dim formGraphics As System.Drawing.Graphics 

     myPen.SetLineCap(LineCap.RoundAnchor, LineCap.ArrowAnchor, DashCap.Flat) 
     formGraphics = Form8.CreateGraphics() 
     formGraphics.DrawLine(myPen, Convert.ToSingle(posofmodif), Convert.ToSingle(vero), Convert.ToSingle(hor), Convert.ToSingle(vern)) 

     myPen.Dispose() 
     formGraphics.Dispose() 

    Next 

Cependant, je voudrais utiliser des étiquettes au lieu de TextBoxes parce qu'il n'a pas de sens d'utiliser TextBoxes plus lourdes dans ce cas. Mais quand je simplement remplacer

Dim tb As New TextBox 

par

Dim tb As New Label 

les étiquettes n'apparaissent sur le formulaire comme prévu, mais les lignes qui les relient apparaissent seulement pour un instant, puis tourner invisible. J'ai d'abord pensé que le problème pouvait être dû au fait que les étiquettes soient au-dessus ou au-dessous des lignes, mais même lorsque je m'assure qu'aucune ligne ne traverse une étiquette, cela arrive.

Quelqu'un at-il une idée de ce que je pourrais faire pour éviter cela?

+1

Où faites-vous le dessin? Si vous ne le faites pas déjà, essayez de le faire dans l'événement Form.Paint. – Joe

Répondre

3

Ceci est votre problème: Form8.CreateGraphics(). Cette méthode est volatile car elle crée une instance Graphics qui ne survit pas à la portée dans laquelle elle est utilisée.

Vous devez utiliser l'événement Paint pour savoir quel contrôle vous souhaitez utiliser. La forme, l'étiquette ... quoi que ce soit. L'événement Paint fournit un objet Graphics à utiliser et il est appelé chaque fois que le dessin doit être actualisé. Parce que l'événement se déclenche fréquemment, vous devez être conscient de ce que vous faites là-bas. Le levage lourd dans un gestionnaire Paint peut ralentir considérablement une application.

+0

Merci - Je n'avais pas encore utilisé l'événement paint mais juste un autre Sub à dessiner. En utilisant l'événement Paint cela fonctionne ... maintenant je dois juste comprendre comment passer élégamment ma datatable au eventhandler (au lieu de simplement le rendre public) – dunkleosteus