1

在 LINQ 上下文中使用 Telerik RadGrid*,使用 ASP.NET/C#,如何在列中显示时将文本截断为最大长度?通过最大值,我的意思是如果原始字符串的长度小于指定的最大长度,则不会引发错误。

我在网上看到了很多这样的例子,但似乎Container.DataItem在使用 LINQ 时用于实现这一点的方法有所不同。有时我们将DataItem其视为一种方法,有时则不是。示例通常使用DataSet.

这是找到的示例(来源):

<asp:TemplateField HeaderText="Description">
  <ItemTemplate>
    <%# ValidateString(Container.DataItem("Description")) %>
  </ItemTemplate>
</asp:TemplateField>

和代码隐藏:

protected string ValidateString(object String)
{
  if ((String.ToString().Length > 50))
  {
    return String.ToString().Substring(0, 50) + "...";
  }
  else
  {
    return String.ToString();
  }
}

感谢您的帮助。

(*) 或普通的 GridView,应该是兼容的。

4

4 回答 4

3

我将挂钩 OnItemDataBound 事件并在您的代码中执行此操作。将数据项转换为您的自定义对象并查询属性,如下所示(从内存中键入一些内容):

protected void RadGrid1_ItemDataBound(object sender, Telerik.Web.UI.GridItemEventArgs e)
{
     if (e.Item is GridDataItem)
     {
          GridDataItem dataBoundItem = e.Item as GridDataItem;
          CustomObject o = e.Item.DataItem as CustomObject;

          if(o.Description.Length > 50)
          {
               dataBoundItem["Description"].Text = o.Description.Substring(0, 47) + "..."
          }
      }
}

或者,如果您想坚持使用您正在使用的方法,请在您的 aspx 中尝试以下操作

<telerik:GridTemplateColumn>
     <ItemTemplate>
          <%# ValidateString(Eval("Description").ToString()) %>
     </ItemTemplate>
</telerik:GridTemplateColumn>
于 2010-01-19T16:25:13.247 回答
1

rrrr使用ItemDataBound事件的想法是一个很好的引导。但是,通过使用带有内部连接的自定义查询来填充我的网格,我无法使用该CustomObject属性。我dataBoundItem["ColumnName"]通过直接修改它的文本来使用它。其实解决方法很简单!

这是一个例子:

protected void RadGrid1_ItemDataBound(object sender, Telerik.Web.UI.GridItemEventArgs e)
{
    if (e.Item is GridDataItem)
    {
        GridDataItem dataBoundItem = e.Item as GridDataItem;
        if (dataBoundItem["ColumnName"].Text.Length > 100)
        {
            dataBoundItem["ColumnName"].Text = dataBoundItem["ColumnName"].Text.Substring(0, 100) + "...";
        }
    }
}

顺便感谢rrrr

于 2010-01-20T14:11:37.817 回答
0

你的代码没问题。只需将“Container.DataItem”更改为“Eval”即可。并保持一切原样。那就试试吧。我希望它会起作用......所有的赌注

现有: <%# ValidateString(Container.DataItem("Description")) %>

更改: <%# ValidateString(Eval("Description")) %>

于 2014-04-07T05:19:55.747 回答
0

使用转换器也适用于此。

<UserControl.Resources>
    <myConverters:SubStringConverter x:Key="First50CharactersConverter" Length="50" ShowEllipse="True" />
</UserControl.Resources>
...
<telerik:GridViewDataColumn DataMemberBinding="{Binding Comments, Converter={StaticResource First50CharactersConverter}}" Header="Comments">

转换器子字符串类:

    /// <summary> Mimics the behavior of string.substring for use in XAML </summary>
public class SubStringConverter : IValueConverter
{
    /// <summary> the zero-based starting character position </summary>
    public int StartIndex { get; set; }

    /// <summary> The number of characters in the substring </summary>
    public int Length { get; set; }

    /// <summary> shows "..." if value was truncated after StartIndex</summary>
    public bool ShowEllipse { get; set; }

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string valueString = value as string;
        if (string.IsNullOrWhiteSpace(valueString) == false)
        {
            if (Length > 0 && Length < (valueString.Length + StartIndex))
            {
                if (ShowEllipse)
                    return valueString.Substring(StartIndex, Length - 3) + "...";
                else
                    return valueString.Substring(StartIndex, Length);
            }
            else if (StartIndex < valueString.Length)
                return valueString.Substring(StartIndex);
            else
                return ""; //because startIndex must be past the length of the string
        }
        else
        {
            return value;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
于 2011-06-04T00:07:29.500 回答