65.9K
CodeProject 正在变化。 阅读更多。
Home

迁移 BoundColumn 到 BoundField 的修复

starIconstarIconstarIconemptyStarIconemptyStarIcon

3.00/5 (1投票)

2007年9月6日

CPOL

1分钟阅读

viewsIcon

17480

将 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 日。
© . All rights reserved.