使用两个 headers 从 gridview 读取

Reading from gridview with two headers

我正在使用 ASP.NET 和 C#。我有 GridView 并且需要两个 header。所以我用下面的代码在数据绑定后又加了一个header

gridView.DataSource = dataTable;
gridView.DataBind();
GridViewRow row = new GridViewRow(0, 0, DataControlRowType.Header, DataControlRowState.Normal);
TableHeaderCell cell = new TableHeaderCell
{
    Text = titleST,
    ColumnSpan = 5
};
row.Controls.Add(cell);
row.BackColor = ColorTranslator.FromHtml("#3AC0F2");
row.BorderStyle = BorderStyle.Solid;
row.BorderColor = Color.Black;
row.BorderWidth = Unit.Parse("2");
gridView.HeaderRow.Parent.Controls.AddAt(0, row);

问题是,当我尝试从 gridView 读取数据时,第一行不知何故没有数据。 这是我读取数据的方式:

foreach (GridViewRow row in gridView.Rows)
{
    int atmpt = ((DropDownList)row.FindControl("ddlAttemptsT")).SelectedIndex;
    Int64 selId = Int64.Parse(((HiddenField)row.FindControl("SelId")).Value);
    double wt = int.Parse(row.Cells[2].Text);
    double grade = double.Parse(((TextBox)row.FindControl("grade")).Text);
}

我想我在索引 0 处添加了新的 header,它删除了第一行。但在 GUI 中,第一行存在。我试着做 AddAt(-1, row) 但那会把它添加到 gridView.

的底部

关于如何解决这个问题有什么建议吗? 如果我需要进一步澄清我的问题,请告诉我。 谢谢

好的,这是坚持的问题

绑定 GV 时 - 它还会为视图状态设置一些“东西”以及它如何记住布局。

如果您在绑定后添加 header?然后它会显示,但不会持久化(因为它在绑定 + 设置后已更改)。 因此,使用现有布局 - 实际上,您确实会写完第一行。

这意味着您需要在绑定过程中添加。

因此,使用 RowCreated 事件。并将您的代码放入该事件中 - 像这样说:

    protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.Header)
        {
            GridViewRow Myrow = new GridViewRow(0, 0, DataControlRowType.Header,
                DataControlRowState.Normal);
            TableHeaderCell cell = new TableHeaderCell
            {
                Text = "My cool title",
                ColumnSpan = 5
            };
            Myrow.Controls.Add(cell);
            Myrow.BackColor = ColorTranslator.FromHtml("#3AC0F2");
            Myrow.BorderStyle = BorderStyle.Solid;
            Myrow.BorderColor = Color.Black;
            Myrow.BorderWidth = Unit.Parse("2");

            // heading actauly does not exist yet
            GridView1.Controls[0].Controls.Add(Myrow);
        }
    }

并且您现在只能在 post back = false 上绑定网格。不管怎样,试试上面的方法,它应该会持续存在,你的第一行现在应该没问题了。