Более 32 ссылок в LinkLabel?

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

System.OverflowException: ошибка переполнения. в System.Drawing.StringFormat.SetMeasurableCharacterRanges (CharacterRange [] диапазоны) в System.Windows.Forms.LinkLabel.CreateStringFormat () в System.Windows.Forms.LinkLabel.EnsureRun (Graphics g) в System.Windows.Forms.LinkLabel (PaintEventArgs e) в System.Windows.Forms.Control.PaintWithErrorHandling (PaintEventArgs e, слой Int16) в System.Windows.Forms.Control.WmPaint (Message & m) в System.Windows.Forms.Control.WndProc (Message & m) в System.Windows.Forms.Label.WndProc (сообщение & m) в System.Windows.Forms.NativeWindow.Callback (IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr 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;
}

person Binyuan Sun    schedule 11.11.2016    source источник


Ответы (1)


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()-метод и самостоятельно завершить отрисовку. (Было бы проще, если бы метод 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 );
}
person Kai Thoma    schedule 11.11.2016