2010-07-29 3 views
1

저는 ASP gridview 컨트롤이 있습니다. 항목 템플릿 열에 ASP 레이블 컨트롤이 있습니다. 격자를 사용하여 데이터에 바인딩 -Eval을 사용하여 잘린 문자열 표시

<ItemTemplate> 
     <asp:Label ID="lblDesc" runat="server" Text='<%# Eval("Description") %>'></asp:Label> 
</ItemTemplate> 

그러나이 문자열의 값은 최대 80 자까지 가능합니다. 그러나 열 길이를 너무 길게 할 여유가 없습니다. 그리고 제한이 있으므로 Wrap="true"을 사용할 수없고 열 너비를 제한 할 수 있습니다.

그래서 솔루션은 그리드에 약 50 자만 표시하고 전체 문자열을 도구 설명으로 표시 할 수 있다고 생각했습니다. 나는 이것을 사용하여 이것을 할 수 있었다. -

<ItemTemplate> 
     <asp:Label ID="lblDesc" runat="server" Text='<%# Eval("Description").ToString().Substring(0,50) %>' ToolTip='<%# Eval("Description") %>'></asp:Label> 
</ItemTemplate> 

그리드 열에 문자열의 처음 50자를 표시한다. 마우스 포인터가 텍스트 위에 놓일 때 전체 문자열이 도구 설명으로 표시됩니다. 그러나 문제는 문자열 길이가 50 자 미만일 때 발생합니다. 이 경우 예외가 발생합니다.

문자열 길이를 확인하여 조건부 표시가 가능하도록이 코드 조각을 수정 해 보았습니다. 그러나, 나는 이것을 작동시키지 못했습니다.

이 문제를 해결할 방법이 있습니까? Eval() 내에서 javascript 함수를 호출 할 수 있습니까? 당신이 당신의 데이터 바인딩 식에 대한 특별한 처리를 필요로 할 때마다

답변

3

, 당신은 당신의 ASPX/ASCX에서 같은

protected string EvalWithMaxLength(string fieldName, int maxLength) 
{ 
    object value = this.Eval(fieldName); 
    if (value == null) 
     return null; 
    string str = value.ToString(); 
    if (value.Length > maxLength) 
     return value.SubString(0, maxLength); 
    else 
     return value; 
} 

당신이 다음 말할 수있는, 코드 숨김 당신의 도우미 함수를 만들 수 있습니다

<ItemTemplate> 
    <asp:Label ID="lblDesc" runat="server" Text='<%# EvalWithMaxLength("Description", 50) %>' ToolTip='<%# Eval("Description") %>'></asp:Label> 
</ItemTemplate> 

당신이 Eval 및 잘라 내기를 분리하려는 경우, 당신은 만들 수

public static class MyExtensions 
{ 
    public static string ToStringTruncated(this object value, int maxLength) 
    { 
     if (value == null) 
      return null; 
     string str = value.ToString(); 
     if (value.Length > maxLength) 
      return value.SubString(0, maxLength); 
     else 
      return value; 
    } 
} 
과 같은 일반적인 확장 메서드 6,

Text='<%# Eval("Description").ToStringTruncated(50) %>' 

를 호출하고 사용자가 입력 object이 확장 방법을 만들어했기 때문에, 당신은 이제 당신이 싶습니다 여부

1234.ToStringTruncated(3) // == "123" 

말할 수는 취향의 문제이다.

public static string TruncateString(string longString, int maxLength) 
{ 
    if (string.IsNullOrEmpty(longString) || longString.Length <= maxLength) 
    { 
     return longString; 
    } 
    else 
    { 
     return longString.Substring(0, maxLength); 
    } 
} 

그런 다음 영문의 코드가 될 것 같은 뭔가 :

2

이 같은 시도 또한 수 있도록 위의에 postFix 매개 변수를 추가 할 수 있습니다

<%# TruncateString(Eval("FieldName").ToString(), 150) %> 

을 잘린 문자열 말하자면 줄임표 (...)를 추가하여 사용자에게 잘 렸음을 경고합니다.

저는 유틸리티 클래스에서 이러한 것들을 유지하여 응용 프로그램 전체에서 사용할 수있게하고 싶습니다. 나는 또한 이것과 Eval을 하나의 방법으로 결합하지 않는 것이 좋다고 생각한다. 왜냐하면 a) 그들은 매우 다른 일을하고 있기 때문이다. b) Eval을 사용하지 않는 곳에서 위의 것을 사용하고 싶을 수도있다.

편집 : null 참조 예외를 throw하지 않고 널 (null)로 평가 ("필드 이름")를 허용하려면 대신이 사용

<%# TruncateString((Eval("FieldName") ?? "").ToString(), 150) %> 
+1

은'조심 평가 ("...") .ToString()'. Eval에서 null을 반환하면 NullReferenceException이 발생합니다. 당신은'<% # TruncateString ((Eval ("FieldName") ?? "") .ToString(), 150) %>'을 시도해 볼 수 있습니다. – Ruben

+0

전화하세요. 이전에이 작업을 수행했을 때부터 이전 코드를 찾고 있었지만 찾을 수 없었기 때문에 위의 코드는 매우 유용했습니다. 나는 개인적으로 너를 좋아하니 ?? 생각; 병합 연산자 만 그렇게 (불필요하게) 애매하지 않은 것이 더 읽기 쉬울 것입니다. –

+0

개인적으로 저는이 솔루션으로 구두점을 너무 많이 사용합니다. DataTables를 사용하고'DBNull' 값을 얻는다면'<% # TruncateString ((string) Eval ("FieldName"), 150) %>'은 폭탄을 터뜨릴 것입니다. – Ruben