关于自定义控件设计时如何把属性写入aspx中的研究(下)

简介: 虽然这一篇已经是“下”了,但是我并没有研究清楚“自定义控件设计时如何把属性写入到aspx中”这个问题。不过,我选择了另外一条路,做了点手脚,让控件把属性写入到aspx中去了。其实,即使有人肯定的告诉我,在上篇中提到的ControlSerializer类的SerializeControl方法就是用于把控件属性写入到aspx中去的,我也实在没办法利用它,它的位置太“深”了。
虽然这一篇已经是“下”了,但是我并没有研究清楚“自定义控件设计时如何把属性写入到aspx中”这个问题。
不过,我选择了另外一条路,做了点手脚,让控件把属性写入到aspx中去了。

其实,即使有人肯定的告诉我,在上篇中提到的ControlSerializer类的SerializeControl方法就是用于把控件属性写入到aspx中去的,我也实在没办法利用它,它的位置太“深”了。

我是通过重写GridView的Columns属性来实现的。我当时想,即使实例A(如果不明白实例A指什么,请看上篇 http://www.cnblogs.com/nnhy/archive/2007/04/05/701485.html)从来不调用CreateColumns方法,但是,它肯定要调用Columns属性吧。重载该属性,并输出日志,果然,有很少的几次调用。不过,已经够了。

我的做法就是,在这个属性的get方法里面,强制改变各列的属性,再返回。设计器在生成控件的aspx时,至少要读取Columns来生成各个列吧。

主要代码如下:
 1 img_405b18b4b6584ae338e0f6ecaf736533.gif img_1c53668bcee393edac0d7b3b3daff1ae.gif          /**/ /// <summary>
 2img_33d02437d135341f0800e3d415312ae8.gif        /// 已重写。获取表示 GridView 控件中列字段的 DataControlField 对象的集合。
 3img_33d02437d135341f0800e3d415312ae8.gif        /// 重写以实现设计时把英文表头转为中文、列重新排序、列宽度调整
 4img_05dd8d549cff04457a6366b0a7c9352a.gif        /// </summary>

 5 img_a6339ee3e57d1d52bc7d02b338e15a60.gif          public   override  DataControlFieldCollection Columns
 6 img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gif         img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif {
 7img_33d02437d135341f0800e3d415312ae8.gif            get
 8img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
 9img_33d02437d135341f0800e3d415312ae8.gif                DataControlFieldCollection cs = base.Columns;
10img_33d02437d135341f0800e3d415312ae8.gif                if (cs == null || cs.Count < 1 || Site == null || Site.Component == nullreturn cs;
11img_33d02437d135341f0800e3d415312ae8.gif                SetDefaultStype(cs);
12img_33d02437d135341f0800e3d415312ae8.gif                NGridView ng = Site.Component as NGridView;
13img_33d02437d135341f0800e3d415312ae8.gif                if (ng == null || !ng.DesignMode) return cs;
14img_33d02437d135341f0800e3d415312ae8.gif                try
15img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif                img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
16img_33d02437d135341f0800e3d415312ae8.gif                    if (ng.GetHashCode() == this.GetHashCode())
17img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif                    img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
18img_33d02437d135341f0800e3d415312ae8.gif                        //if (isEntryCreating || !(isChanged || AutoGenerateDeleteButton || AutoGenerateEditButton || AutoGenerateSelectButton)) return cs;
19img_33d02437d135341f0800e3d415312ae8.gif                        if (isEntryCreating) return cs;
20img_33d02437d135341f0800e3d415312ae8.gif                        //SetDefaultStype(cs);
21img_33d02437d135341f0800e3d415312ae8.gif                        if (!isChanged) return cs;
22img_33d02437d135341f0800e3d415312ae8.gif                        isEntryCreating = true;
23img_33d02437d135341f0800e3d415312ae8.gif                        CreateEntryColumns(cs);
24img_105a1e124122b2abcee4ea8e9f5108f3.gif                    }

25img_105a1e124122b2abcee4ea8e9f5108f3.gif                }

26img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif                catch (Exception ex) img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{ MessageBox.Show(ex.Message, "NGridView"); }
27img_33d02437d135341f0800e3d415312ae8.gif                finally
28img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif                img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
29img_33d02437d135341f0800e3d415312ae8.gif                    isEntryCreating = false;
30img_33d02437d135341f0800e3d415312ae8.gif                    isChanged = false;
31img_105a1e124122b2abcee4ea8e9f5108f3.gif                }

32img_33d02437d135341f0800e3d415312ae8.gif                return cs;
33img_105a1e124122b2abcee4ea8e9f5108f3.gif            }

34img_05dd8d549cff04457a6366b0a7c9352a.gif        }

35 img_a6339ee3e57d1d52bc7d02b338e15a60.gif

CreateEntryColumns就是我用来改变列属性的方法,之前的几个判断,是为了防止列属性被频繁改变。我只需要在绑定数据源之后改变就可以了。

语句if (ng.GetHashCode() == this.GetHashCode()),通过判断当前对象和A对象的HashCode,来判断是否是同一个实例,也就是说,我要求这个重载,只在实例A中生效。

最后的结果,还挺令人满意的。目前正在想法子重载DetailView和FormView 我不相信神话,我只相信汗水!我不相信命运,我只相信双手!
相关文章
关于VB6.0中控件加载的难题
我想大家都多多少少都为VB6.0中ActiveX控件的加载而感到头痛,比如有时候在打开一个工程的瞬间它给你弹出无法加载或加载错误的提示框,在你想用到某个控件时,VB6.0中又找不到……这样的情况真的很让人恼火!!!
|
C#
WPF整理-为控件添加自定义附加属性
原文:WPF整理-为控件添加自定义附加属性 附加属性,大家都不陌生,最常见的是Canvas.Left/Canvas.Top,类似的也有Grid.Row/Grid.Column等附加属性。举个最常见的例子 需要说明的是并不是所有的附加属性都是元素放进去后才会有附加效果,上面的例子只是刚好是这种错觉的巧合情况,Grid.Row也属于这种巧合。
2042 0
QtApplets-自定义控件-7-属性研究
QtApplets-自定义控件-7-属性研究
85 0
QtApplets-自定义控件-7-属性研究
QtApplets-自定义控件-5-属性研究
QtApplets-自定义控件-5-属性研究
96 0
QtApplets-自定义控件-5-属性研究
QtApplets-自定义控件-4-属性研究
QtApplets-自定义控件-4-属性研究
106 0
QtApplets-自定义控件-4-属性研究
QtApplets-自定义控件-6-属性研究(未成功)
QtApplets-自定义控件-6-属性研究(未成功)
117 0
QtApplets-自定义控件-6-属性研究(未成功)
|
C#
艾伟_转载:WPF/Silverlight陷阱:XAML自定义控件的嵌套内容无法通过名称访问
为了说明这个问题,假定我们需要实现一个具有特殊功能的按钮控件。编写Xaml文件如下: Button> 对 Code Behind类,唯一的改动是把向导生成的基类从UserControl改成Button: public partial class XamlButton : Button{    ...
1046 0
|
Web App开发
艾伟:WinForm控件开发总结(七)-----为复杂属性的子属性提供编辑功能
前面的几篇文章中,我们给控件添加一个复杂的类型Scope,并且给它的类型提供的一个类型转换器,现在我们可以在属性浏览器中编辑它的值,并且它的值也被串行化的源代码里了。但是你有没有发现,在属性浏览器里编辑这个属性的值还是不太方便。
666 0
|
Web App开发
艾伟:WinForm控件开发总结(五)-----为控件的复杂属性提供类型转换器
上一篇文章我已经介绍了TypeConverterAttribute元数据的作用,本文将通过代码向你展示具体的实现。在这个例子中,我要给控件添加一个复杂的属性,这个属性对这个控件没有什么功用,纯粹是为了演示,有些牵强附会了。
794 0
艾伟:WinForm控件开发总结(六)-----控件属性类型转换器代码详解
在上一篇文章,我为控件添加一个一个复杂属性,并且为这个属性的类型的编写了一个类型转换器,现在我们来看看这个类型转换器的代码,并解释一下这些代码的意义。       要实现一个类型转换器,我们必须要重写(override)四个方法:       CanConvertFrom()――根据类型参数进行测试,判断是否能从这个类型转换成当前类型,在本例中我们只提供转换string和InstanceDescriptor类型的能力。
812 0