Усечение содержимого текстового поля с многоточием в SSRS

#reporting-services #textbox #ssrs-2008 #overflow #ellipsis

#службы отчетов #текстовое поле #ssrs-2008 #переполнение #многоточие

Вопрос:

По умолчанию, когда содержимое текстового поля в SSRS превышает ширину текстового поля, текстовое поле увеличивается по вертикали, чтобы вместить его содержимое. Эту функцию можно отключить, установив для свойства «CanGrow» текстового поля значение «False».

Однако это резко отключает содержимое, что не идеально.

Я ищу способ четко показать пользователю, что текст слишком широк, чтобы поместиться в текстовое поле. В прошлом я использовал простое выражение для добавления многоточия «…», когда длина текстовой строки превышала некоторое фиксированное число:

 =Iif(Len(Fields!CustomerName.Value) > 25, 
     Left(Fields!CustomerName.Value,23)   "...", 
     Fields!CustomerName.Value)
  

Но это плохо работает, когда имена клиентов содержат смесь заглавных букв, строчных букв, знаков препинания и прочего, из-за чего ширина отдельных символов в пикселях сильно различается.

В идеале, какое-либо свойство для элемента управления текстовым полем позволило бы разработчику отчета добавлять многоточие всякий раз, когда текст не помещается в текстовое поле.

Есть ли у кого-нибудь предложения по более элегантному подходу к этому?

Ответ №1:

Другое решение, которое я придумал, заключается в использовании VB.NET , в частности, TextRenderer.Функция measureText().

Чтобы это сработало, я добавил в отчет следующий код:

 Public Function TextWidth(str As String) AS Double
    'Returns the width, in pixels, of a string, assuming Tahoma size 8.
    Dim size As System.Drawing.SizeF
    Dim font As New system.Drawing.Font("Tahoma", 8)
    size = System.Windows.Forms.TextRenderer.MeasureText(str, font)
    TextWidth = size.Width
End Function

Public Function TextCap(str As String, maxWidth As Integer, Optional suffix As String = "") As String
    'Truncates a string to fit within maxWidth pixels, optionally adding a suffix string if
    'any characters were truncated.

    Dim w As Integer, l As Integer
    l = Len(str)
    w = TextWidth(str)
    For i As Integer = 1 To 10
        If (w > maxWidth) Then
            l = (l * maxWidth / w)
            If (l < 0) Then
                l = 0
                Exit For
            End If
            w = TextWidth(Left(str, l)   suffix)
        Else
            Exit For
        End If
    Next i

    If l < Len(str) Then
        TextCap = Left(str, l)   suffix
    Else
        TextCap = Left(str, l)
    End If
End Function
  

Не забудьте добавить ссылки на систему сборок.Чертеж (2.0.0.0) и система.Windows.Формы (2.0.0.0). TextWidth Функция вычислит ширину строки текста, используя шрифт Tahoma, размер 8. Это можно легко сделать динамическим, добавив имя шрифта и размер шрифта в качестве дополнительных параметров к обеим функциям.

При вызове TextCap функции из выражения SSRS, подобного этому:

 =Code.TextCap(Fields!CustomerName.Value, 150, "...")
  

текст будет автоматически усечен на 150 пикселей, а аргумент суффикса «…» будет добавлен в случае, если какие-либо символы были усечены.

Комментарии:

1. Хорошая работа, но этот алгоритм не учитывает многоточия при измерении обрезанного текста. Теоретически возможно урезать текст до размера чуть меньше максимальной ширины, но при добавлении многоточий он возвращается. Я думаю, вам нужно w = TextWidth(Left(str, l) suffix) внутри вашего For цикла.

2. Вы абсолютно правы, спасибо. Я соответствующим образом отредактировал код.

3. Также не учитывается, что ваш столбец теперь ограничен, поэтому инструкции должны включать скрытый столбец с фактическим текстом, если это имеет значение при экспорте. Таким образом, решение действительно должно быть параметром форматирования, а не усеченным текстом. Вы также можете указать полный текст во всплывающей подсказке.

4. Хороший вариант, но может ли он просто извлекать ширину, шрифт и размер шрифта из самого текстового поля?