自定义功能类似与Repeater的模板化数据绑定控件(包括控件的 Designer)。控件从webcontrol继承过来的话,什么问题都没有。但如果从control继承过来,没办法获得设计时期的界面,GetDesignTimeHtml返回的是空内容。由于控件没有定义任何样式(类似于Pepeater),代码没有重写过任何与呈现有关的函数。请问是怎么回事,问题怎么解决。

解决方案 »

  1.   

    从control继承,在运行期也不会出问题。
      

  2.   

    从WebControl中得到的是更多的支持。
    例如Attributes,Style,ControlStyle,Tag,Render时的支持等。如果你继承Control,那当然很多事情要自己做。
      

  3.   

    首先我做的是个模板化数据绑定控件,功能有点类似Repeater控件,该控件无论从webcontrol或从control派生在运行时都不会出现问题。我现在想得到设计时期的界面呈现支持,但不想对其在设计界面时进行模板编辑(类似Repeater只能在HTML视图下编辑),因此设计器是从ControlDesigner派生过来的,而不是从TemplatedControlDesigner派生。又由于控件不需要任何的样式,因此控件从Control派生(这点类似于Repeater也是从Control派生,而DataList是从WebControl派生)。现在的问题是,控件从Control派生时设计界面始终都是空空的,不管是否模板是否有内容,就只调用GetEmptyDesignTimeHtml的内容。但如果我把控件从WebControl派生,就可以得到类似与Repeater在设计时期的界面。我怀疑是否从Control派生要重写Render方法,当查看了下Repeater控件,也没有重写该方法,同时Repeater控件的设计器RepeaterDesigner也是从ControlDesigner继承的。
      

  4.   

    控件的源代码在:
    http://www.cnco.cn/vtest/tidylist/index.htm希望能发现错在那里。
      

  5.   

    >>>>现在的问题是,控件从Control派生时设计界面始终都是空空的,不管是否模板是否有内容,就只调用GetEmptyDesignTimeHtml的内容something is probably wrong with your designerthe following works for me:using System;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.ComponentModel;
    using System.Web.UI.Design;namespace SimpleControls
    {
    public class SimpleDesigner : System.Web.UI.Design.ControlDesigner 
    {
    public override string GetDesignTimeHtml() 
    {
    return "design time";
    }

    protected override string GetEmptyDesignTimeHtml()
    {
    return "empty";
    //return base.GetEmptyDesignTimeHtml ();
    }
    } [DefaultProperty("Text"),
    ToolboxData("<{0}:TestSimple runat=server></{0}:TestSimple>"),
    Designer(typeof(SimpleDesigner))
    ]
    public class TestSimple : System.Web.UI.Control //System.Web.UI.WebControls.WebControl
    {
    private string text; [Bindable(true),Category("Appearance"),DefaultValue("")]
    public string Text
    {
    get {return text;}
    set {text = value;}
    }
    protected override void Render(HtmlTextWriter output)
    {
    output.Write(Text);
    }
    }
    }try to see if you have anything...
    public override string GetDesignTimeHtml() 
    {
    TidyList tl = (TidyList)Component;
    string designTimeHTML = null; IEnumerable designTimeDataSource = GetDesignTimeDataSource(5);
    try 
    {
    tl.DataSource = designTimeDataSource;
    tl.DataBind();
    System.Windows.Forms.MessageBox.Show(tl.Items.Count.ToString()); designTimeHTML = base.GetDesignTimeHtml();
    }
    catch (Exception e) 
    {
    designTimeHTML = GetErrorDesignTimeHtml(e);
    }
    finally 
    {
    tl.DataSource = null;
    }
    return designTimeHTML;
    }
      

  6.   

    这种方式我有测试过,得到的结果是和预期的一样为5。designTimeDataSource里面也有数据。但调用designTimeHTML = base.GetDesignTimeHtml的结果还是为空。不知道问题出在设计器还是控件的代码,因为我控件如果从WebControl派生,就可以得到正确的DesignTimeHtml内容,而从Control派生得到DesignTimeHtml的内容为空。
      

  7.   

    you meanthis shows 5:System.Windows.Forms.MessageBox.Show(tl.Items.Count.ToString()); but this is empty?designTimeHTML = base.GetDesignTimeHtml();
    System.Windows.Forms.MessageBox.Show(designTimeHTML); 
      

  8.   

    是这样的,这时控件是Control派生的。
    但如果控件WebControl派生。
    designTimeHTML = base.GetDesignTimeHtml();
    System.Windows.Forms.MessageBox.Show(designTimeHTML); 
    得到就是预期的内容。
      

  9.   

    问题已解决。
    控件要多个属性 PersistChildren(false),不然ItemTemplate为NULL ,子控件加不进去。
    好象Control默认PersistChildren为true,而WebControl默认PersistChildren为false;