关于自己自定义控件用到WebResource.axd资源管理及其它一些问题

在写自定义控件--包含一个TextBox和ImageButton和一个脚本文件Calendar.js和Gif文件的简单日期复合控件
日期部分全部由脚本文件(Calendar.js的作者是谁,我已经忘了)实现.
简单说明这个日期复合控件功能:
点击ImageButton,弹出日期窗口,选择日期窗口中的日期,选中的就写在TextBox中
碰到的一些问题列举如下:
1. 最开始时, 因考虑按键不需要回发,故选用了HtmlImage, 涉及其图像部分则定义为复合控件的属性Src
   (1)先定义
 private HtmlImage _himg = new HtmlImage();

   (2)定义属性 
        [Bindable(true)]
        [Category("Default")]
        [DefaultValue("")]
        [Description("起始时间的图像Url")]
        public string Src
        {
            get
            {
                EnsureChildControls();
                return _himg .Src;
            }
            set
            {
                EnsureChildControls();
                _himg.Src = value;
            }
        }
   (3)生成并被网站引用后添加在Default.aspx中,这是查看复合控件其属性Src是空的。
往其中输入图像的HRL, 控件中图像位出现的X正常显示了。可奇怪的是Src中输入的字符
串内容不见了,但控件中按键的图像没有问题。
   (4)但使用ImageButton就没有这个问题
 private ImageButton _imgBtn = new ImageButton();

        [Bindable(true)]
        [Category("Default")]
        [DefaultValue("")]
        [Description("图像Url")]
        public string ImageUrl
        {
            get
            {
                EnsureChildControls();
                return _imgBtn.ImageUrl;
            }
            set
            {
                EnsureChildControls();
                _imgBtn.ImageUrl = value;
            }
        }
 
 复合控件这时的属性是ImageUrl就没有这个问题,输入图像的URL后控件正常显示,
ImageUrl中录入的字符串内容也还在
     不明白为什么?难道就是因为是Html控件,所以无法象标准Web控件那样。是这个原因
还是其它的原因.

2. 由于第一个问题的原因,也就将HtmlImge用ImageButton服务器控件替换了。由于考虑
无须事件回发(应为调用脚本文件)使用如下
_imgBtn.OnClientClick = "fPopCalendar(..); return false;";
_imgBtn.CausesValidation = false;
替换
_himg.Attributes.Add("onclick", "fPopCalendar(..); return false;");

3. 想到如果每次使用复合控件都要设置按键的图像太麻烦,在复合控件中就直接设定图像好了。
也就要用到WebResource.axd资源管理了
使用时如下:
Calendar.js
[assembly: System.Web.UI.WebResource("MyWebControls.MyTextBox.Calendar.js", "text/javascript")]
MyWebControls.MyTextBox中MyWebControls是项目名称,MyTextBox是脚本文件所在的文件夹
注册脚本文件
protected override void OnPreRender(EventArgs e)
{
   if (!this.Page.ClientScript.IsClientScriptIncludeRegistered(this.GetType(), "Calendar"))
   {
      //注册所需脚本
      this.Page.ClientScript.RegisterClientScriptInclude
      (
         this.GetType(),
         "Calendar",
         this.Page.ClientScript.GetWebResourceUrl
         (
            this.GetType(), "MyWebControls.MyTextBox.Calendar.js"
         )
      );
   }

   base.OnPreRender(e);
}
然后在复合控件中就可以使用脚本文件中函数和变量了
如:_himg.Attributes.Add("onclick", "fPopCalendar(..); return false;");
fPopCalendar() 是在脚本文件Calendar.JS中定义的.

而使用图像文件则如下:
[assembly: System.Web.UI.WebResource("MyWebControls.Images.Calendar1.gif", "image/gif")]
Images也是文件夹.
_himg.Src = this.Page.ClientScript.GetWebResourceUrl(typeof(DateTextBox), "MyWebControls.Images.Calendar1.gif");
使用方法和上面脚本是一样的,其中的DateTextBox也就是this.GetType(),既复合控件类名,

其中最容易忽视的是要将资源文件Calendar.js和Calendar1.gif的属性中的生成操作由“内容”
改为“嵌入资源”。

4. 生成没问题,引用后在ASPX页面中显示不正常,也就是控件的长度不对和按键的图像没有。
发现这些属性设置自己是将其放在CreateChildControls中的。而在页面中使用时应该是呈现,
所以应将属性设置放在Render中.

至此复合控件就可以用了。
源代码如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值