c# - 在 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;
}
解决方案
终于用静态方法弄明白了;根据相应的复选框设置手动引用每个列索引。不是最迷人的解决方案,但它确实有效。如果您有更好的解决方案,请贡献。
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
}
推荐阅读
- kotlin - 如何在操作栏上显示 3 点菜单?
- css - 将不透明度 30% 设置为线性渐变
- database - 存储分段函数的数据结构
- javascript - 在while循环中更新了一个div
- asp.net-mvc - 剑道标签条内剑道网格的“无效模板”错误
- database - 使用 JDBC GetConnection 建立数据库连接失败
- quadratic-programming - 不同版本的 CVXPY 会产生不同的结果。
- powershell - 在一定时间后停止 Powershell 命令
- excel - 添加断点时代码会抛出错误,否则不会
- c# - 如何使用 Mongo DB 驱动程序在列表中执行更新或删除