我有一个ASP.NET GridView,其中的列如下所示:

| Foo | Bar | Total1 | Total2 | Total3 |

可以在两行上创建一个如下所示的标题吗?

|           |  Totals   |    
| Foo | Bar | 1 | 2 | 3 |

每一行中的数据都将保持不变,因为这只是为了修饰标题并减少网格占用的水平空间.

整个GridView都是可排序的,以备不时之需.我不希望添加的"总计"跨越列具有任何排序功能.

Edit:

基于下面给出的其中一篇文章,我创建了一个从GridView继承的类,并在中添加了第二个标题行.

namespace CustomControls
{
    public class TwoHeadedGridView : GridView
    {
        protected Table InnerTable
        {
            get
            {
                if (this.HasControls())
                {
                    return (Table)this.Controls[0];
                }

                return null;
            }
        }

        protected override void OnDataBound(EventArgs e)
        {
            base.OnDataBound(e);
            this.CreateSecondHeader();
        }

        private void CreateSecondHeader()
        {
            GridViewRow row = new GridViewRow(0, -1, DataControlRowType.Header, DataControlRowState.Normal);

            TableCell left = new TableHeaderCell();
            left.ColumnSpan = 3;
            row.Cells.Add(left);

            TableCell totals = new TableHeaderCell();
            totals.ColumnSpan = this.Columns.Count - 3;
            totals.Text = "Totals";
            row.Cells.Add(totals);

            this.InnerTable.Rows.AddAt(0, row);
        }
    }
}

以防你是ASP的新手.NET和我一样,我也应该指出,你需要:

1) 通过在web表单中添加以下行来注册课程:

<%@ Register TagPrefix="foo" NameSpace="CustomControls" Assembly="__code"%>

2)将前面标记中的asp:GridView更改为foo:TwoHeadedGridView.别忘了结束标签.

Another edit:

也可以在不创建自定义类的情况下执行此操作.

只需为网格的数据绑定事件添加一个事件处理程序,如下所示:

protected void gvOrganisms_DataBound(object sender, EventArgs e)
{
    GridView grid = sender as GridView;

    if (grid != null)
    {
        GridViewRow row = new GridViewRow(0, -1,
            DataControlRowType.Header, DataControlRowState.Normal);

        TableCell left = new TableHeaderCell();
        left.ColumnSpan = 3;
        row.Cells.Add(left);

        TableCell totals = new TableHeaderCell();
        totals.ColumnSpan = grid.Columns.Count - 3;
        totals.Text = "Totals";
        row.Cells.Add(totals);

        Table t = grid.Controls[0] as Table;
        if (t != null)
        {
            t.Rows.AddAt(0, row);
        }
    }
}

自定义控件的优点是,您可以在web表单的设计视图上看到额外的标题行.不过,事件处理程序方法要简单一些.

推荐答案

This article应该会给你指明正确的方向.您可以通过编程方式创建行,并将其添加到集合中的位置0.

Asp.net相关问答推荐

在Docker Windows中,ASP.NET核心容器在自定义端口8080上运行,但ASP.NET容器在固定端口80上运行

Stimulsoft 没有在智能手机中显示正确的 pdf 字体

InvalidOperationException:在程序集上找不到UserSecretsIdAttribute

在 ASP.Net 中使用自定义 RoleProvider 时如何允许多个角色查看页面

如何删除字符串的定义部分?

SqlBulkCopy 超时

ASP.NET Core 1.0 ConfigurationBuilder().AddJsonFile("appsettings.json");找不到文件

解析器错误消息:无法加载类型sometype

等待本地主机,永远!

RestSharp 不反序列化 JSON 对象列表,始终为 Null

配置转换和TransformXml 任务失败错误消息

ASP.NET IIS Web.config [内部服务器错误]

@(at) 登录文件路径/字符串

如何将表从存储过程检索到数据表?

.NET - c# - 需要跨分区查询,但在 DocumentDB 数据访问上禁用了问题

ASP.NET 按钮重定向到另一个页面

在 C# 中动态创建 Json

如何将代码中的变量调用到aspx页面

重新生成designer.cs

如何使用实体框架执行原始 SQL 查询而无需使用模型?