Показать усеченную строку, используя Eval - PullRequest
1 голос
/ 29 июля 2010

У меня есть элемент управления gridview ASP.У меня есть элемент управления меткой 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 символов.В этом случае выдается исключение.

Я попытался изменить этот фрагмент кода, чтобы разрешить условное отображение, проверив длину строки.Но я не мог заставить это работать.

Есть ли способ решить эту проблему?Можем ли мы вызвать функцию JavaScript в Eval ()?

Ответы [ 2 ]

3 голосов
/ 29 июля 2010

Всякий раз, когда вам нужна специальная обработка для выражений привязки данных, вы можете просто сделать вспомогательную функцию в вашем коде, например

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 голосов
/ 29 июля 2010

Попробуйте что-то вроде этого:

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 ("FieldName") был нулевым, не вызывая исключение нулевой ссылки, используйте это вместо:

<%# TruncateString((Eval("FieldName") ?? "").ToString(), 150) %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...