对于上下文,请继续阅读,但最终是否可以/(以及如何)在 OnDataBound() 或 OnPreRender() 事件中更新(删除/隐藏列)GridView?
我从数据库查询数据并将其显示在网格视图上。我使用 OnRowDataBound 事件来格式化数字等。在该结果集中,我有一个名为“orderby”的列,用于对结果行进行排序。我想从网格视图中删除此列。如果我自动生成列,我可以通过在 DataControlRowType.Header 和 DataControlRowType.DataRow 上执行以下操作 (e.Row.Cells[r].Visible = false;) 在 OnRowDataBound() 事件中隐藏此列。如果我不自动生成列,并且在 .aspx 的列参数中添加 hide="true",则它不起作用。我不是在 .aspx 中寻找解决方案顺便说一句...
出于某种原因,我认为 OnDataBound() 和 OnPreRender() 事件可用于更新 GridView(隐藏行、列、创建总行),但情况似乎并非如此。如果我尝试下面的方法,它不起作用(即使有数据,gridView.Columns.Count 也是 0)。如果我使用 OnRowDataBound() 事件,我可以获得所需的效果,但我想知道:
顺便说一句,我正在运行:.Net 版本:4.0.30319.42000,运行时版本:.NET Framework 4.8.4645.0
protected void checks_DataBound(object sender, EventArgs e)
{
GridView gridView = (GridView)sender;
if (gridView.ClientID == "checks_db_sod01")
{
for (int c = 0; c < gridView.Columns.Count; c++)
{
if (gridView.Columns[c].HeaderText.ToLower().Trim() == "orderby")
{
gridView.Columns[c].Visible = false;
}
}
}
}
您可能应该在每篇文章中提出一个问题,但是,为了解决您的具体问题:
OnDataBound()
和OnPreRender()
可以更新GridView
的某些方面,例如数据格式化或应用样式。它们不用于结构变化,例如删除列;为此,您通常会直接操作 GridView 的属性或在 GridView 的初始化或数据绑定阶段处理此类任务。不过,您可以使用 PreRender 来隐藏您的列。请注意,我已经使用 Web 表单大约 5 年了,但这可能会让您入门:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
// Initialize or bind your GridView here.
// You can manipulate GridView columns before or after binding.
}
}
protected void checks_DataBound(object sender, EventArgs e)
{
// You can perform final adjustments to the GridView after data binding.
// This could include formatting, styling, calculations...
}
protected void checks_PreRender(object sender, EventArgs e)
{
var gridView = (GridView)sender;
if (gridView.ClientID == "checks_db_sod01")
{
// Iterate through columns and hide the one with header text "orderby".
foreach (DataControlField column in gridView.Columns)
{
if (column.HeaderText.ToLower().Trim() == "orderby")
{
column.Visible = false;
}
}
}
}
希望这有帮助!