2010-07-29 21 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

每当你需要特殊处理你的数据绑定表达式,你可以做一个辅助功能,在您的代码隐藏,如

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; 
} 

在你的ASPX/ASCX然后你可以说

<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; 
    } 
} 

,并呼吁

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

而且因为你所做的object型这种扩展方法,你现在也可以说

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

无论你想这是一个品味的问题。

2

尝试是这样的:

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

然后你在ASPX代码会是这样的:

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

您可能还需要一个postFix参数添加到上面,以便截断字符串附加一个省略号(...)以警告用户他们已被截断。

我喜欢在实用类中保留这样的东西,以便它们在整个应用程序中都可用。我也认为不要试图将这个和Eval结合成一个单一的方法是个好主意,因为a)他们做了非常不同的事情,并且b)你可能想要在没有使用Eval的情况下使用上述方法。

编辑:如果希望允许的eval(“字段名”)是没有抛出一个空引用异常空,而使用这样的:

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

小心'的eval(“...”)的ToString()'。如果Eval返回null,你会得到一个NullReferenceException。你可以试试'<%#TruncateString((Eval(“FieldName”)??“”).ToString(),150)%>'但这并不会使事情更具可读性。 – Ruben 2010-07-29 15:14:09

+0

良好的通话。我之前一直在寻找我的旧代码,但是我找不到它,所以上面的代码几乎是即时的。我个人喜欢你?理念;如果只有合并操作员不那么(不当地)模糊,它会更具可读性。 – 2010-07-29 15:19:29

+0

我个人用这个解决方案进入标点符号超负荷状态;但是如果你使用DataTables并且你会得到一个'DBNull'值,''%#TruncateString((String)Eval(“FieldName”),150)%>'会炸弹。 – Ruben 2010-07-29 15:28:25