使用Eval显示截断的字符串

时间:2010-07-29 14:18:33

标签: javascript asp.net gridview

我有一个ASP gridview控件。我在项目模板列中有一个ASP标签控件。我使用 -

将数据绑定到网格
<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函数吗?

2 个答案:

答案 0 :(得分: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"

你是否喜欢这是一个品味问题。

答案 1 :(得分: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的地方。 / p>

编辑:如果要在不抛出空引用异常的情况下允许Eval(“FieldName”)为空,请改用:

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