2016-11-11 18 views
1

В настоящее время я делаю приложение на C#, которое использует LinkLabels. У меня есть функция, которая добавляет новую ссылку для каждого элемента в определенном массиве. Однако бывает, что массив имеет более 32 ссылок, и когда это происходит, я получаю исключение OverflowException:Более 32 ссылок в LinkLabel?

System.OverflowException: ошибка переполнения. на System.Drawing.StringFormat.SetMeasurableCharacterRanges (ДиапазонСимволы [] диапазоны) в System.Windows.Forms.LinkLabel.CreateStringFormat() в System.Windows.Forms.LinkLabel.EnsureRun (График г) в System.Windows.Forms .LinkLabel.OnPaint (PaintEventArgs е) в System.Windows.Forms.Control.PaintWithErrorHandling (PaintEventArgs е, Int16 слой) на System.Windows.Forms.Control.WmPaint (Сообщение & м) на System.Windows.Forms. Control.WndProc (Сообщение & м) на System.Windows.Forms.Label.WndProc (сообщение & м) на System.Windows.Forms.NativeWindow.Callback (IntPtr HWND, Int32 MSG, IntPtr, IntPtr WPARAM LPARAM)

Есть ли способ переопределить функцию SetMeasurableCharacterRanges. Чтобы он не выдавал эту ошибку при наличии более 32 символов? Вот пример моего кода:

int LengthCounter = 0; 
llbl.Links.Clear(); 
string[] props = AList.ToArray(); 

llbl.Text = string.Join(", ", props); 
foreach (var Prop in props) 
{ 
    llbl.Links.Add(LengthCounter, Prop.Length, string.Format("{0}{1}", prefix, Sanitize(Prop))); 
    LengthCounter += Prop.Length + 2; 
} 

ответ

2

SetMeasurableCharacterRanges реализуется следующим образом:

/// <summary>Specifies an array of <see cref="T:System.Drawing.CharacterRange" /> structures that represent the ranges of characters measured by a call to the <see cref="M:System.Drawing.Graphics.MeasureCharacterRanges(System.String,System.Drawing.Font,System.Drawing.RectangleF,System.Drawing.StringFormat)" /> method.</summary> 
/// <param name="ranges">An array of <see cref="T:System.Drawing.CharacterRange" /> structures that specifies the ranges of characters measured by a call to the <see cref="M:System.Drawing.Graphics.MeasureCharacterRanges(System.String,System.Drawing.Font,System.Drawing.RectangleF,System.Drawing.StringFormat)" /> method.</param> 
/// <exception cref="T:System.OverflowException">More than 32 character ranges are set.</exception> 
public void SetMeasurableCharacterRanges(CharacterRange[] ranges) 
{ 
    int num = SafeNativeMethods.Gdip.GdipSetStringFormatMeasurableCharacterRanges(new HandleRef(this, this.nativeFormat), ranges.Length, ranges); 
    if(num != 0) 
     throw SafeNativeMethods.Gdip.StatusException(num); 
} 

Класс StringFormat герметизируют и метод SetMeasurableCharacterRanges не является виртуальным, так что вы не можете переопределить его. И внутри он выполняет вызов API до gdiplus.dll.

Что вы можете попробовать это наследовать пользовательские LinkLabel из LinkLabel и переопределить OnPaint() -метод и сделать рисунок complety по своему усмотрению. (Все было бы проще, если бы метод CreateStringFormat() не был внутренним.)

Или вы просто использовать множественные LinkLabels на FlowLayoutPanel только одна ссылка на этикетке:

for(int i = 0; i < AList.Count; i++) 
{ 
    string prop = AList[i]; 
    LinkLabel llbl = new LinkLabel() 
    { 
     AutoSize = true, 
     Margin = new Padding(0), 
     Name = "llbl" + i, 
     Text = prop + ", " 
    }; 
    llbl.Links.Add(0, prop.Length, string.Format("{0}{1}", prefix, Sanitize(prop))); 

    flowLayoutPanel1.Controls.Add(llbl); 
}