2017-08-30 30 views
1

我想在代碼中在窗體上繪製TextBoxes/Labels並將它們與線連接 - 基於我存儲在數據表(「treedata」)中的數據。如果我使用下面的代碼一切正常:System.Drawing.Pen - 將標籤放置在表單上時線條消失

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 

不過,我想,因爲它沒有任何意義在這種情況下使用較重的文本框使用標籤,而不是文本框。但是,當我只需

Dim tb As New Label 

更換

Dim tb As New TextBox 

標籤都在表上顯示爲預期,但連接它們的線只出現了片刻,然後隱形。

我首先認爲問題可能是由於標籤超出或低於線條引起的,但即使我確保沒有線條穿過任何標籤,它也會發生。

有沒有人有一個想法,我可以做什麼來避免這種情況?

+1

你在做什麼?如果您尚未這樣做,請嘗試在Form.Paint事件中執行此操作。 – Joe

回答

3

這就是你的問題:Form8.CreateGraphics()。該方法是不穩定的,因爲它會創建一個不能在其使用範圍內存活的實例。

您需要使用Paint事件來控制您打算繪製的任何控件。形式,標籤......無論如何。 Paint事件提供了一個供您使用的Graphics對象,並且每當需要刷新繪圖時它都會被調用。

由於事件頻繁發生,您需要注意您在那裏做了什麼。 Paint處理程序中的繁重程序可能會顯着降低應用程序的速度。

+0

謝謝 - 我到目前爲止還沒有使用過繪畫事件,但只是另一個Sub繪製。使用Paint事件它的工作....現在我只需要弄清楚如何優雅地傳遞我的數據表到事件處理程序(而不是公開設置它) – dunkleosteus