2014-06-19 1 views
4

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

Однако это резко отсекает контент, что не является идеальным.

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

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

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

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

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

ответ

6

Другим решением, которое я придумал, является использование 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 

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

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

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

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

+1

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

+0

Вы абсолютно правы, спасибо. Я отредактировал код соответственно. – Dan

+0

Вау, это волшебство, в котором я использую Stack Overflow for. – Nathan