~~~~~~~~~~~自定义控件开发问题~~~~~~~~~~~~~~

ChengKing 2007-05-13 03:02:20
自定义控件开发设计模式遇到问题:

按这样在页面中引入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样式后,
能看到效果? 需要怎样设置?
...全文
347 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ivony 2007-05-14
  • 打赏
  • 举报
回复
如果是要插入CSS链接,那么应该使用Page.Header……
sunjay117 2007-05-14
  • 打赏
  • 举报
回复
要不试试RenderContents
Robin 2007-05-14
  • 打赏
  • 举报
回复
我顶
ly_0205 2007-05-13
  • 打赏
  • 举报
回复
用Write的问题就是多个控件在一个页面会重复,
具体有没有问题这个不清楚,习惯性会避免这种情况..
ly_0205 2007-05-13
  • 打赏
  • 举报
回复
我不清楚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 ...");
weizhuangzhi 2007-05-13
  • 打赏
  • 举报
回复
应该不行,设计时和实际运行还是有一定差异的,一些运行时才可能出现的环境或者值在设计时因为还没有办法确定,所以不会有效果。

建议你使用其他的方法在设计时达到同样的效果,因为毕竟控件运行时才是最重要的,设计时只是让开发人员了解控件的外观状态。
ChengKing 2007-05-13
  • 打赏
  • 举报
回复
To ly_0205:
一般注册引用文件资源如: js/css等是在PreRender事件中写的, 但PreRender在设计模式时不执行, Render中注册又"晚"了. 比较难办.

有没有更好的办法?
mdl821120 2007-05-13
  • 打赏
  • 举报
回复
学习,帮顶了,楼主是我见过的信誉值最高的了,问一下,怎么信誉值可以涨的那么多呢?别的星星都没有那么高哦
ly_0205 2007-05-13
  • 打赏
  • 举报
回复
在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
ly_0205 2007-05-13
  • 打赏
  • 举报
回复
嗯,
我想可能设计时不行是因为根本没有写入ClientScriptBlock/StartupScript,
不过这个我不能确认。

你可以试试Register一段文本,可以看到的,
看设计时出来不?不出来应该就是没有写入..
ChengKing 2007-05-13
  • 打赏
  • 举报
回复
To ly_0205:
试过了, 也是不行的.
另外说明一下, 虽然在设计器中不能够显示效果, 但运行时是没有问题的.
ly_0205 2007-05-13
  • 打赏
  • 举报
回复
页面下控件的Render在写入ClientScriptBlock之后,
你控件Render的时候才RegisterClientScriptBlock,实际上没写进去..
你试试RegisterStartupScript.

我用2003,2005有没有什么不同不清楚,我想这个大概不会变吧..
kmiaoer 2007-05-13
  • 打赏
  • 举报
回复
up

62,051

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧