2014-06-19 3 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) 및 System.Windows.Forms를 추가해야합니다 (2.0 :

이 일을하려면, 내가 보고서에 다음 코드를 추가 한 .0.0). TextWidth 함수는 Tahoma 글꼴, 크기 8을 사용하여 텍스트 문자열의 너비를 계산합니다.이 기능은 글꼴 이름과 글꼴 크기를 두 매개 변수의 추가 매개 변수로 추가하여 쉽게 동적으로 만들 수 있습니다.

이와 같은 SSRS 식 중 TextCap 함수 호출 :

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

텍스트를 자동으로 150 픽셀로 절단하고, 접미사 인수한다 "..."경우에 추가 될 모든 문자가 있었다을 잘린.

+1

잘 작동하지만이 알고리즘은 잘라내어 진 텍스트를 측정 할 때 타원을 고려하지 않습니다. 이론적으로 텍스트를 최대 너비 바로 아래의 내용으로 트리밍 할 수 있지만 타원이 추가되면 다시 넘어갑니다. 'For' 루프 안에'w = TextWidth (Left (str, l) + suffix)'가 필요하다고 생각합니다. –

+0

당신이 옳습니다. 고마워요. 그에 따라 코드를 편집했습니다. – Dan

+0

와우,이 스택 오버플로를 사용하는 마법의 종류입니다. – Nathan