自定义控件开发设计模式遇到问题:按这样在页面中引入CSS文件, 
<link id="CSS_KEY" type="text/css" rel="stylesheet" href="MyToolButton.css" />
在设计器中属性窗口设置自定义控件样式后, 能在设计器中看到设置的样式效果.但按下面这种方式在自定义控件中引入CSS文件.
protected override void Render(HtmlTextWriter writer)
{
     if (DesignMode)
     {
          string strCSSPath = Path.Combine(this.ClientPath, @"Default\CSS\ToolButton.css");
          if (!Page.ClientScript.IsClientScriptBlockRegistered(this.GetType(), "ToolButtonCSS"))
          {
                Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "ToolButtonCSS",
               "<LINK REL='stylesheet' TYPE='text/css' HREF='" + strCSSPath + "'></LINK>");
          }         
     }
  base.RenderContents(writer);
}
则在设计器属性窗口中设置自定义控件的CSS类属性时, 不能看到效果.注: 经过调试,第二中引入CSS文件方式(自定义控件中Rdner方法引入)语句确实执行了, Render方法在设计器和运行时都会执行.
现前提是用第二种引入CSS方式, 怎样才能够在设计器属性窗口设置CSS样式后, 
能看到效果? 需要怎样设置?

解决方案 »

  1.   

    页面下控件的Render在写入ClientScriptBlock之后,
    你控件Render的时候才RegisterClientScriptBlock,实际上没写进去..
    你试试RegisterStartupScript.我用2003,2005有没有什么不同不清楚,我想这个大概不会变吧..
      

  2.   

    To ly_0205:
    试过了, 也是不行的.
    另外说明一下, 虽然在设计器中不能够显示效果, 但运行时是没有问题的.
      

  3.   

    嗯,
    我想可能设计时不行是因为根本没有写入ClientScriptBlock/StartupScript,
    不过这个我不能确认。你可以试试Register一段文本,可以看到的,
    看设计时出来不?不出来应该就是没有写入..
      

  4.   

    在2003看了一下,
    运行时,Page的Form Render时调用Page的OnFormRender/OnFormPostRender写入ClientScriptBlock/StartupScript。
    Page.Form是System.Web.UI.HtmlControls.HtmlForm类型, 这个的Designer是System.Web.UI.Design.HtmlIntrinsicControlDesigner,这里面没有找到任何调用了HtmlForm及其基类Render/RenderControl方法的地方。
    设计时,Page.Form的Render没有执行,不写入ClientScriptBlock/StartupScript
      

  5.   

    To ly_0205:
    一般注册引用文件资源如: js/css等是在PreRender事件中写的, 但PreRender在设计模式时不执行, Render中注册又"晚"了. 比较难办.有没有更好的办法?
      

  6.   

    我不清楚2003/2005有些什么区别,在2003中,
    运行时,控件Render方法里面RegisterClientScriptBlock会"晚",RegisterStartupScript还可以用。
    设计时,这两种都是没用的,因为设计器根本不会写入注册script。
    这种想想也是可以理解的,设计时并没有被设计Page的实例,他能表现出来无非是通过数据,就是html代码,模板(aspx文件)的与子控件Designer的GetDesignTimeHtml(?, 大概这个名称吧)得到的。
    在控件Render中写RegisterStartupScript,这个是Page的方法(2003,你的有个ClientScript,不过我想相差不大),交给Page处理了,注册的script在控件生成html中没有任何痕迹。
    设计时这个Page对象哪里来的我不清楚,可以确认的是可能不会是设计的这个页面。
    也就是说Designer不知道有注册script,不能表现出来很正常。以上,要求设计时可以看到效果,我唯一想到的办法是控件生成html包含这个link,
    也就是Render里面写成: writer.Write("<link ...");
      

  7.   

    用Write的问题就是多个控件在一个页面会重复,
    具体有没有问题这个不清楚,习惯性会避免这种情况..
      

  8.   

    如果是要插入CSS链接,那么应该使用Page.Header……