首页 > 解决方案 > 在 GridView 上动态设置 ColumnSpan 会间歇性地破坏布局

问题描述

我有一个 GridView,根据用户的 CheckBox 选择显示/隐藏列。渲染 GridView 时,第一行文本需要跨越多列。gridview 是在我的控制之外生成的,数值列的数量是动态的,所以我只能在 gridview 绑定数据后设置可见性。由于数字列的数量是动态的,我无法向后遍历列集合,因为我永远不知道会有多少列。

显示所有列时效果很好:

在此处输入图像描述

当不显示任何列时,它运行良好:

在此处输入图像描述

显示单列时,它会中断:

在此处输入图像描述

有人可以纠正我有缺陷的逻辑并解释为什么我的方法不起作用吗?我认为问题在于我如何从行中删除单元格以匹配列跨度值。

protected void ButtonClicked(object sender, EventArgs e)
{
    // reset from previous postback
    gv.Columns[2].Visible = true;
    gv.Columns[3].Visible = true;

    CreateGridView();

    gv.Columns[2].Visible = ShowFoo.Checked;
    gv.Columns[3].Visible = ShowBar.Checked;
        
    int colSpan = 2; // Span FirstName + Surname columns
    colSpan += ShowFoo.Checked ? 1 : 0;
    colSpan += ShowBar.Checked ? 1 : 0;

    for(int c = 1; c <= colSpan - 1; c++) // 1 = Leaving the first cell so the cell text value is preserved
    {
        gv.Rows[0].Cells.RemoveAt(1); // remove the second cell each time to reduce the cell collection
    }

    gv.Rows[0].Cells[0].ColumnSpan = colSpan;
}

标签: c#asp.netgridviewwebforms

解决方案


终于用静态方法弄明白了;根据相应的复选框设置手动引用每个列索引。不是最迷人的解决方案,但它确实有效。如果您有更好的解决方案,请贡献。

protected void ButtonClicked(object sender, EventArgs e)
{
    // reset from previous postback
    gv.Columns[2].Visible = true;
    gv.Columns[3].Visible = true;

    CreateGridView();

    gv.Columns[2].Visible = ShowFoo.Checked;
    gv.Columns[3].Visible = ShowBar.Checked;

    // Calculate column span

    int colSpan = 2; // Span FirstName + Surname columns
    colSpan += ShowFoo.Checked ? 1 : 0;
    colSpan += ShowBar.Checked ? 1 : 0;
    gv.Rows[0].Cells[0].ColumnSpan = colSpan;

    // Remove cells (last-to-first to preserve cell indexes)

    if (ShowBar.Checked) { gv.Rows[0].Cells.RemoveAt(3); } // Remove Bar column
    if (ShowFoo.Checked) { gv.Rows[0].Cells.RemoveAt(2); } // Remove Foo column
    gv.Rows[0].Cells.RemoveAt(1); // Remove Surname column

}

推荐阅读