×

Loading...
Ad by
  • 推荐 OXIO 加拿大高速网络,最低月费仅$40. 使用推荐码 RCR37MB 可获得一个月的免费服务
Ad by
  • 推荐 OXIO 加拿大高速网络,最低月费仅$40. 使用推荐码 RCR37MB 可获得一个月的免费服务

虽然前两天知道了答案,一直没时间写出来,今天和大家分享一下

本文发表在 rolia.net 枫下论坛ASP.NET Server Control Design Time Support

做过自己的 asp.net server control 了吗?有没有象 ASP.NET DataGrid 控件那样:
1。从 Toolbox 一拽出来,自动产生一堆代码
2。right click 看属性时,有一大堆 custom attribute
3。还能进入 template edit 模式把 toolbox 里的 textbox 之类的东东拽到你的控件中
4。甚至还能弹出一个自己的对话框来做巨复杂的配置

我花了一天时间来看如何做这些东东,虽然最后发现目前我不需要这些 features 但是还是
愿意和大家分享一下,有些东东你不去看真的不知道原来如此简单,正如同有些东西你看完
发现居然如此复杂一样。

主要文档: (注意 url 换行)
msdn lib: Enhancing Design-Time Support
http://msdn.microsoft.com/library/default.asp?
url=/library/en-us/cpguide/html/cpconenhancingdesign-timesupport.asp
PDC02 session 407 名字好像是 build asp.net server control 之类的。

msdn 文档第一段里就开门见山说:
In the .NET Framework, the work for design-time support is not delegated to a
design environment such as Visual Studio .NET but is enabled through a rich
built-in design-time architecture.

所以你要做的东东不是什么 vs.net add-on,而是直接扩展你的控件。

1。从 Toolbox 一拽出来,自动产生一堆代码
这件事情是通过在你的 server control 代码里加个 attribute 实现的:
(要不怎么说 attribute programming 呢)
[ToolboxData("<{0}:myControl runat=server></{0}:myControl>")]
public class myControl : System.Web.UI.WebControls.DataGrid // 随便举个例子
这样你把你的控件拽到 webform 里面时,它就会自动生成这些代码乐。

2。right click 看属性时,有一大堆 custom attribute
比如说你的控件里面有个属性是指定 xsl file 的 url,你可以这样:
[
Browsable(true),
Category("Data"),
DefaultValue("http://myserver/myApp/myXSL.xsl"),
Description("specify your XSL file URL"),
Editor(typeof(System.Web.UI.Design.XslUrlEditor),
typeof(System.Drawing.Design.UITypeEditor))
]
public string MyXSLTSrc {...}
如此这般,你就可以在属性对话框的 data 组中看到你的 MyXSLTSrc 乐,
而且你可以通过一个专门的选 xsl url 的对话框来指定这个值乐。

3。还能进入 template edit 模式把 toolbox 里的 textbox 之类的东东拽到你的控件中
免费午餐结束了。剩下东东真的要写代码了。
首先得告诉控件你为它老人家专门作了个 designer:
[ Designer("YourNameSpace.Design.MyControlDesigner, YourNameSpace") ]
public class myControl : System.Web.UI.WebControls.DataGrid // 随便举个例子

然后真的给它老人家做个 Designer:
namespace YourNameSpace.Design
{
public class MyControlDesigner : System.Web.UI.Design.WebControls.DataGridDesigner
{ // 由于 control 是从 DataGrid 继承的,control designer 也就从 DataGridDesigner 继承
}
}

这个 designer 主要要做什么事情呢?
你至少要 render 出一段 html code 来,这样在 VS.NET IDE 的 design view 里你才能看见
您老辛辛苦苦做的 control。
主要通过 override 这些 methods:
public override string GetDesignTimeHtml()
protected override string GetEmptyDesignTimeHtml()

比如你的控件支持 data binding 什么的,你可以考虑使用一些 sample data 去显示。
或者多做些工作真的把 page developer 指定的 data source 绑定了显示出来。

仔细看文档你就会发现如何建立 edit template。做了 edit template 后你 right click 你的
控件就可以进入编辑模式,比如你的控件中包含一个 content template,你就可以把 toolbox 里
的 asp.net textbox, checkbox 之类的东东直接 drag & drop 到里面去乐。

4。甚至还能弹出一个自己的对话框来做巨复杂的配置
要想实现这个还要多花些功夫,你必须再做一个 MyControlComponentEditor,
public class MyControlComponentEditor : System.Web.UI.Design.WebControls.DataGridComponentEditor
并且告诉 myControl 它老人家请用这个 Editor:
[Editor(typeof(MyControlComponentEditor), typeof(ComponentEditor))]
public class myControl : System.Web.UI.WebControls.DataGrid // 随便举个例子

如何通过 override methods 去具体实现,自己查文档 8。

休息,休息一下。更多精彩文章及讨论,请光临枫下论坛 rolia.net
Report

Replies, comments and Discussions:

  • 工作学习 / IT技术讨论 / 纯技术讨论:关于 ASP.NET server control designer 的问题 (level 400 ;-) )
    今天看了看 asp.net server control designer。
    主要文档: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconenhancingdesign-timesupport.asp
    现在已经了解如何在 vs.net design view 里面显示,如何创建 template 如何做 data binding 了。
    由于我做的 control 和 data grid 有些关系,于是 control 是从 asp.net data grid control 继承的,control designer 也就从 datagriddesigner 继承了。所以现在如果在 design view 里 right click control,也可以看到 asp.net datagrid 所特有的 property build...
    我的问题是:
    如果 designer 不从 datagriddesinger 继承,如何自己做 property builder 之类的东东?今天我只看到如何创建 edit template。
    如何在现有的 datagrid property builder 对话框中增改东东?
    能通过 System.Web.UI.Design.WebControls.DataGridDesigner 干点儿什么?
    望做过的 DX 不吝赐教。先谢了。
    • 知道答案了。
      • 俺也知道了!
      • 虽然前两天知道了答案,一直没时间写出来,今天和大家分享一下
        本文发表在 rolia.net 枫下论坛ASP.NET Server Control Design Time Support

        做过自己的 asp.net server control 了吗?有没有象 ASP.NET DataGrid 控件那样:
        1。从 Toolbox 一拽出来,自动产生一堆代码
        2。right click 看属性时,有一大堆 custom attribute
        3。还能进入 template edit 模式把 toolbox 里的 textbox 之类的东东拽到你的控件中
        4。甚至还能弹出一个自己的对话框来做巨复杂的配置

        我花了一天时间来看如何做这些东东,虽然最后发现目前我不需要这些 features 但是还是
        愿意和大家分享一下,有些东东你不去看真的不知道原来如此简单,正如同有些东西你看完
        发现居然如此复杂一样。

        主要文档: (注意 url 换行)
        msdn lib: Enhancing Design-Time Support
        http://msdn.microsoft.com/library/default.asp?
        url=/library/en-us/cpguide/html/cpconenhancingdesign-timesupport.asp
        PDC02 session 407 名字好像是 build asp.net server control 之类的。

        msdn 文档第一段里就开门见山说:
        In the .NET Framework, the work for design-time support is not delegated to a
        design environment such as Visual Studio .NET but is enabled through a rich
        built-in design-time architecture.

        所以你要做的东东不是什么 vs.net add-on,而是直接扩展你的控件。

        1。从 Toolbox 一拽出来,自动产生一堆代码
        这件事情是通过在你的 server control 代码里加个 attribute 实现的:
        (要不怎么说 attribute programming 呢)
        [ToolboxData("<{0}:myControl runat=server></{0}:myControl>")]
        public class myControl : System.Web.UI.WebControls.DataGrid // 随便举个例子
        这样你把你的控件拽到 webform 里面时,它就会自动生成这些代码乐。

        2。right click 看属性时,有一大堆 custom attribute
        比如说你的控件里面有个属性是指定 xsl file 的 url,你可以这样:
        [
        Browsable(true),
        Category("Data"),
        DefaultValue("http://myserver/myApp/myXSL.xsl"),
        Description("specify your XSL file URL"),
        Editor(typeof(System.Web.UI.Design.XslUrlEditor),
        typeof(System.Drawing.Design.UITypeEditor))
        ]
        public string MyXSLTSrc {...}
        如此这般,你就可以在属性对话框的 data 组中看到你的 MyXSLTSrc 乐,
        而且你可以通过一个专门的选 xsl url 的对话框来指定这个值乐。

        3。还能进入 template edit 模式把 toolbox 里的 textbox 之类的东东拽到你的控件中
        免费午餐结束了。剩下东东真的要写代码了。
        首先得告诉控件你为它老人家专门作了个 designer:
        [ Designer("YourNameSpace.Design.MyControlDesigner, YourNameSpace") ]
        public class myControl : System.Web.UI.WebControls.DataGrid // 随便举个例子

        然后真的给它老人家做个 Designer:
        namespace YourNameSpace.Design
        {
        public class MyControlDesigner : System.Web.UI.Design.WebControls.DataGridDesigner
        { // 由于 control 是从 DataGrid 继承的,control designer 也就从 DataGridDesigner 继承
        }
        }

        这个 designer 主要要做什么事情呢?
        你至少要 render 出一段 html code 来,这样在 VS.NET IDE 的 design view 里你才能看见
        您老辛辛苦苦做的 control。
        主要通过 override 这些 methods:
        public override string GetDesignTimeHtml()
        protected override string GetEmptyDesignTimeHtml()

        比如你的控件支持 data binding 什么的,你可以考虑使用一些 sample data 去显示。
        或者多做些工作真的把 page developer 指定的 data source 绑定了显示出来。

        仔细看文档你就会发现如何建立 edit template。做了 edit template 后你 right click 你的
        控件就可以进入编辑模式,比如你的控件中包含一个 content template,你就可以把 toolbox 里
        的 asp.net textbox, checkbox 之类的东东直接 drag & drop 到里面去乐。

        4。甚至还能弹出一个自己的对话框来做巨复杂的配置
        要想实现这个还要多花些功夫,你必须再做一个 MyControlComponentEditor,
        public class MyControlComponentEditor : System.Web.UI.Design.WebControls.DataGridComponentEditor
        并且告诉 myControl 它老人家请用这个 Editor:
        [Editor(typeof(MyControlComponentEditor), typeof(ComponentEditor))]
        public class myControl : System.Web.UI.WebControls.DataGrid // 随便举个例子

        如何通过 override methods 去具体实现,自己查文档 8。

        休息,休息一下。更多精彩文章及讨论,请光临枫下论坛 rolia.net
        • 好!!
        • 太专业了,看不懂!
          • 差不多就你一人跟贴,还叫倒好儿,真让偶伤心
            看那么多 DX 嚷嚷对 .NET 有兴趣,本想抛块砖引堆玉,结果也就您接招。
            • 无敌是最痛苦,无敌是最寂寞,
            • 我虽然不懂技术,但是也懂得一些道理:一些纯粹的东西真正理解的人是不多的。但是也不要紧呀,与别人分享美好的东西是一种快乐,也许很少人回应,但并不意味着很少人读过。只要是分享,大家都是心存感激的*_^