#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. Хороший вариант, но может ли он просто извлекать ширину, шрифт и размер шрифта из самого текстового поля?