我把设计器的代码帖出来,大家看看,msdn上的示例我也看过了,不过还是解决不了问题。
public class MarqueeControlDesigner:ControlDesigner
{
const int VirtualItemCount=5; public MarqueeControlDesigner():base()
{ } public override bool AllowResize
{
get
{
return true;
}
} public override string GetDesignTimeHtml()
{
Marquee target=(Marquee)this.Component; if(target.DataSource !=null)
{
return GetDataBindingDesignTimeHtml();
} if(target.Items.Count<1)
{
return GetEmptyDesignTimeHtml();
}
else
{
return base.GetDesignTimeHtml();
}
} protected virtual string GetDataBindingDesignTimeHtml()
{
Marquee target=(Marquee)this.Component;
target.DataTextField="Text";
target.DataValueField="Value";
target.DataUrlField="Url";
target.DataSource=GetDesignDataSource();
target.DataBind(); return base.GetDesignTimeHtml(); } protected virtual object GetDesignDataSource()
{
DataTable result=new DataTable();
DataRow newRow;
Marquee target=(Marquee)this.Component; result.Columns.AddRange(new DataColumn[]{new DataColumn("Text",typeof(string)),new DataColumn("Value",typeof(string)),new DataColumn("Href",typeof(string))});
for(int i=0;i<VirtualItemCount;i++)
{
newRow=result.NewRow();
newRow["Text"]="[#"+target.DataTextField+"]";
newRow["Value"]="[Value]";
newRow["Href"]="[Href]";
result.Rows.Add(newRow);
} return result;
} public override void UpdateDesignTimeHtml()
{
base.UpdateDesignTimeHtml();
} protected override string GetEmptyDesignTimeHtml()
{
return "<b>"+"Edit items property to design this control."+"</b>";
} public override bool DesignTimeHtmlRequiresLoadComplete
{
get
{
return true;
}
} protected override string GetErrorDesignTimeHtml(System.Exception e)
{
return "<font color=red>"+e.Message+"</font>";
} protected override void PreFilterProperties(IDictionary properties)
{
base.PreFilterProperties(properties);
} public override void OnComponentChanged(object sender, System.ComponentModel.Design.ComponentChangedEventArgs ce)
{
}
}

解决方案 »

  1.   

    制作内嵌VS.NET的服务器控件
     做过自己的 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。
      

  2.   

    ASP.NET服务器控件与组件开发
    目录:http://www.dearbook.com.cn/book/Catalog.aspx?pno=TS0012426&type=1
    你可以下载这本书的源码来看看可能对你有帮助
      

  3.   

    1、在所对应的类上加上[Designer(Editor,TypeConverter)]等属性后,在运行时,和平时一样,能调试啊(???)
    2、3只要属性是个集合如Items ,就要通过UI设计器来实现属性,自定义界面
      

  4.   

    2可以参考:
    http://www.csdn.net/develop/Read_Article.asp?id=24936
    http://www.csdn.net/develop/Read_Article.asp?id=24937
    http://www.csdn.net/develop/Read_Article.asp?id=24938
    http://www.csdn.net/develop/Read_Article.asp?id=24939经典文章收藏-------自定义属性的性质
      

  5.   

    楼上的,谢谢了,可能我没有说清楚。
    1.不是控件不能调试,而是控件的设计时支持类不能调试。如我写MarqueeControlDesigner。
    2.不是如何编辑集合Items。编辑这个属性的UITypeEditor我早就完成了。DataGrid的样式编辑不是通过Editor来实现的,它是以导航树的形式来实现的,我指的是DataGrid的样式在vs.net IDE中通用属性编辑器表现形式。
    3.每三个问题实现上是两个:一个如何把Items中的内容在设计时显示出来;我的Items是通过ControlBuilder来生成的。别一个问题是这样,怎么才能使在Designer类中对控件属性的修改不影响Control本身的属性。