65.9K
CodeProject 正在变化。 阅读更多。
Home

在 GridView 中处理长数据条目

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.13/5 (9投票s)

2007年1月22日

CPOL

2分钟阅读

viewsIcon

42726

downloadIcon

334

本文描述了如何为 GridView 控件实现 ITemplate 接口。

引言

本文介绍在动态创建的情况下如何实现 GridView 控件。 在本文中,我使用 TemplateFiled 列来实现,这些列是动态添加到 GridView 中的。 重点是动态地将列添加到网格中,并且只需要指定 SQL 查询即可。 本文提供了一种简单、易用且清晰的解决方案来显示数据。

背景

我正在为一家公司开发一个报表系统,我需要实现动态报表。 有标准报表和动态报表。 标准报表是最常用的报表,而动态报表是该系统的一项功能。 这些动态报表还有其他要求。 它们必须看起来很漂亮。 长数据条目必须被截断。 我为我的客户提供了两种查看长数据条目的方式,让他选择最适合他的方式。

服务器端

ITemplate 实现

为了截断并显示长数据条目,我必须为我的网格实现 ITemplate 接口。 我将这个类命名为 TemplateGridItem,并创建了接口 IFormatGridItem。 它只有一个名为 Format 的方法。 这是 TemplateGridItem 构造函数

public TemplateGridItem(string columnName , IFormatGridItem formatGridItem)
{
      _columnName=columnName;
      _formatGridItem = formatGridItem;
}

其中 columnName 是列的名称,而 formatGridItemIFormatGidItem 接口的实现。

这是 IFormatGridItem 接口

public interface IFormatGridItem
{
    string Format(string dataEntry , string columnName);
}

这个类和接口实现是静态的 - 它在任何数据显示过程中都不会改变。 例如,它可以构建成一个 .dll 文件并附加到一个项目。

还有许多要求,例如报表皮肤、数据项中的客户端脚本等等。 本文仅显示最简单的方法(例如,在我的系统中,我有七个 IFormatGridItem 的实现)。 为了创建您自己的特殊格式,您只需要实现 IFormatGridItem 并将其传递给 TemplateGridItem 构造函数即可。

public class CustomGridItem : IFormatGridItem
{
    public string Format(string dataEntry, string columnName )
    {
        if (dataEntry == null)
              return string.Empty;

        if (dataEntry.Length < 30)
            return "<span>" + HttpUtility.HtmlEncode(dataEntry) + "</span;>";

        string entry = dataEntry.Substring(0, 30);

        return "<span>" + HttpUtility.HtmlEncode(entry) + 
               "</span> <span title=\"Click here to " + 
               "view full\" style='cursor:hand;text-decoration:underline;" + 
               "color:blue' entry=" + HttpUtility.HtmlEncode(dataEntry)+ 
               " onclick="popUpLongName(this.entry)" >...</span>";
    }
}

CustomGridItem 传递给 TemplateGridItem

DataTable dataTable = SqlDataAccess.GetDataTable(sqlQuery);

for (int i = 0; i < dataTable.Columns.Count; i++)
{
    DataColumn dataColumn = dataTable.Columns[i];
    TemplateField gridColumn = new TemplateField();
    gridColumn.ItemTemplate = new TemplateGridItem(
               dataColumn.ColumnName, new CustomGridItem());
    gridColumn.HeaderText = dataColumn.ColumnName;
    uxGrid.Columns.Add(gridColumn);
}

uxGrid.DataSource = dataTable;
uxGrid.DataBind();

TemplateGridItem 具有一个 OnDataBinding 事件,该事件调用接口 Format 方法。

public void OnDataBinding(object sender, EventArgs e)
{
    LiteralControl literal = (LiteralControl) sender;
    DataRowView dataRowView = 
      (DataRowView)((GridViewRow) literal.NamingContainer).DataItem;
    string gridItemValue = dataRowView[_columnName].ToString();
    literal.Text = _formatGridItem.Format(gridItemValue, _columnName);    
}

客户端

还有必要的客户端脚本来显示长数据条目。 在演示中,有两种显示长数据条目的方式:

  1. 模态 IE 窗口
  2. 弹出行
© . All rights reserved.