Winforms LinkLabel Exception ~ 32 Link Maximum

J

Jason

I'm working on a large VB.NET WinForms app, that uses the
System.Windows.Forms.LinkLabel extensively to create links within text
blocks so users can navigate around. I have come upon a major flaw in the
base LinkLabel: you can't have more than 32 links in a LinkLabel (error
producing code below).

The LinkLabel seems to accept over 32 links using the LinkLabel.Links.Add()
method. The error occurs when painting the LinkLabel (stack trace below) in
the SetMeasurableCharacterRanges function.

I read that a potential solution is to chunk the CharacterRange array:
http://www.vbug.co.uk/technicalsupport/topicposts.asp?CID=1&TID=158,
http://www.dotnet247.com/247reference/msgs/30/153947.aspx

I would assume this chunking would be done in an overriden OnPaint - has
anyone attempted this?

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load

Dim l As New LinkLabel()
Dim i As Integer
Dim startPos As Integer
Dim linkLength As Integer = 3

l.Text = "0123456789 0123456789 0123456789 0123456789 0123456789
0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789
0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789
0123456789 0123456789 0123456789 0123456789"

For i = 0 To 30 'change 30 to 31 to raise overflow error
l.Links.Add(startPos, linkLength)
startPos = startPos + linkLength + 1
Next

l.Width = Me.Width
l.Height = 300
Me.Controls.Add(l)

End Sub



Message: Overflow error
Source: System.Drawing
StackTrace: " at
System.Drawing.StringFormat.SetMeasurableCharacterRanges(CharacterRange[]
ranges)
at System.Windows.Forms.LinkLabel.GetStringFormat()
at System.Windows.Forms.LinkLabel.EnsureRun(Graphics g)
at System.Windows.Forms.LinkLabel.OnPaint(PaintEventArgs e)
at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e,
Int16 layer, Boolean disposeEventArgs)
at System.Windows.Forms.Control.WmPaint(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.Label.WndProc(Message& m)
at System.Windows.Forms.LinkLabel.WndProc(Message& msg)
at System.Windows.Forms.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd,
Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.SafeNativeMethods.UpdateWindow(HandleRef hWnd)
at System.Windows.Forms.Control.Update()
at System.Windows.Forms.Control.Refresh()


Thanks in advance, Jason
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top