在写自定义控件--包含一个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中.
至此复合控件就可以用了。
源代码如下: