迁移 BoundColumn 到 BoundField 的修复
将 DataTable 转换为 DataView 时,BoundColumn => BoundField 问题解决方案。
引言
在将 DataTable
转换为 GridView
控件的大型(内网)应用程序中,当 BoundColumn
设置为 "Visible=false
" 时,经常会发生对象引用错误。
背景
在应用程序中使用 DataTable
控件时,开发人员有时会将 BoundColumn
设置为不可见,以便隐藏数据,同时在客户端应用程序(如 JavaScript)中使用隐藏数据。
然而,BoundField
在 "visible" 设置为 false
时,不会在客户端渲染任何数据。在转换大型应用程序时,这可能会导致一些问题。通常的解决方法是在 "OnDataBind
" 事件之后以编程方式将 "visible
" 属性设置为 false
。但是,此解决方案会消耗时间。
为了在短时间内解决此问题,我创建了自己的类,该类以 BoundField
为基础。该类通过在初始化时将字段的值设置为可见,并在字段绑定后将其恢复来简单地解决该问题。
Using the Code
要使用此解决方案,请在应用程序代码中放置一个名为 BoundColumnField
的新类。将以下代码添加到该类
namespace GridViewFix
{
public class BoundColumnField : BoundField
{
private Boolean NotVisible;
protected override void InitializeDataCell(
DataControlFieldCell cell, DataControlRowState rowState)
{
NotVisible = false;
//If the Field isn't set to visible=true
//the control will set it to visible.
if (!this.Visible)
{
this.Visible = true;
NotVisible = true;
}
base.InitializeDataCell(cell, rowState);
}
protected override void OnDataBindField(object sender, EventArgs e)
{
base.OnDataBindField(sender, e);
//If the Field had visible=False the field will be hidden after databind.
if (NotVisible) this.Visible = false;
}
}
}
首先在您想要使用此控件的每个页面顶部注册您的命名空间,如下所示
<%@ Register TagPrefix="GridViewFix" Namespace="GridViewFix"%>
接下来,您可以在 DataGrid
中使用该类(使用 <GridViewFix:BoundColumnField>
代替)。该类的用法与 BoundField
类相同。只有渲染行为与旧的 BoundColumn
控件兼容。
关注点
Microsoft 移除了不可见字段的渲染,出于安全原因。此修复程序更改了隐藏字段的行为。请记住,当用户打开客户端代码时,隐藏值将可访问。
历史
- 1.0:添加了我的第一篇文章 - 2007 年 9 月 6 日。