ASP.NET源码之自定义控件DateTimePicker怎么用
ASP.NET 是一种面向 Web 应用程序的服务端框架,支持多种编程语言,如 C#、VB.NET、F# 等。其中,自定义控件是 ASP.NET 的一个强大功能,它可以帮助开发者封装常用的业务逻辑和视图,提高开发效率和代码重用性。
本文将介绍如何使用 ASP.NET 的自定义控件 DateTimePicker,实现日期和时间的选择功能。
Step 1:创建自定义控件
在 Visual Studio 中创建一个新的 ASP.NET 控件库项目,命名为 DateTimePicker。右键项目,选择添加 -> 新建项,创建一个名为 DateTimePicker.cs 的控件类。
在控件类中,继承 ASP.NET 中的 WebControl 类,并添加以下代码:
public class DateTimePicker : WebControl
{
protected HiddenField _hiddenField = new HiddenField();
protected TextBox _textBox = new TextBox();
protected Calendar _calendar = new Calendar();
protected DropDownList _hoursDropDownList = new DropDownList();
protected DropDownList _minutesDropDownList = new DropDownList();
protected override void RenderContents(HtmlTextWriter output)
{
output.Write("<div>");
_hiddenField.RenderControl(output);
_textBox.RenderControl(output);
output.Write("<img src='Images/calendar.png' onclick='showCalendar()' />");
_calendar.Visible = false;
_calendar.ID = "calendar";
_calendar.SelectionMode = CalendarSelectionMode.Day;
_calendar.DayRender += _calendar_DayRender;
_calendar.SelectedDateChanged += _calendar_SelectedDateChanged;
output.Write("<div id='calendarContainer' style='display: none;'>");
_calendar.RenderControl(output);
output.Write("</div>");
output.Write("</div>");
output.Write("<div>");
_hoursDropDownList.RenderControl(output);
output.Write(":");
_minutesDropDownList.RenderControl(output);
output.Write("</div>");
}
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
_hiddenField.ID = "hiddenField";
_hiddenField.ValueChanged += _hiddenField_ValueChanged;
_textBox.ID = "textBox";
_textBox.TextChanged += _textBox_TextChanged;
for (int i = 0; i < 24; i++)
{
_hoursDropDownList.Items.Add(i.ToString("D2"));
}
for (int i = 0; i < 60; i++)
{
_minutesDropDownList.Items.Add(i.ToString("D2"));
}
}
private void _calendar_DayRender(object sender, DayRenderEventArgs e)
{
if (!e.Day.IsOtherMonth && !e.Day.IsWeekend)
{
e.Cell.Attributes.Add("style", "background-color: #ddf;");
}
}
private void _calendar_SelectedDateChanged(object sender, EventArgs e)
{
DateTime selectedDate = _calendar.SelectedDate.Date;
_textBox.Text = selectedDate.ToString("yyyy-MM-dd");
_hoursDropDownList.SelectedValue = selectedDate.Hour.ToString("D2");
_minutesDropDownList.SelectedValue = selectedDate.Minute.ToString("D2");
_hiddenField.Value = selectedDate.ToString("yyyy-MM-dd HH:mm:ss");
}
private void _hiddenField_ValueChanged(object sender, EventArgs e)
{
DateTime selectedDate;
if (DateTime.TryParse(_hiddenField.Value, out selectedDate))
{
_textBox.Text = selectedDate.ToString("yyyy-MM-dd");
_hoursDropDownList.SelectedValue = selectedDate.Hour.ToString("D2");
_minutesDropDownList.SelectedValue = selectedDate.Minute.ToString("D2");
}
_calendar.VisibleDate = selectedDate;
_calendar.SelectedDate = selectedDate;
}
private void _textBox_TextChanged(object sender, EventArgs e)
{
DateTime selectedDate;
if (!DateTime.TryParse(_textBox.Text, out selectedDate))
{
selectedDate = DateTime.Now.Date;
}
_calendar.VisibleDate = selectedDate;
_calendar.SelectedDate = selectedDate;
_hoursDropDownList.SelectedValue = selectedDate.Hour.ToString("D2");
_minutesDropDownList.SelectedValue = selectedDate.Minute.ToString("D2");
_hiddenField.Value = selectedDate.ToString("yyyy-MM-dd HH:mm:ss");
}
}
以上代码的作用如下:
- 构造函数 _hiddenField、_textBox、_calendar、_hoursDropDownList、_minutesDropDownList。
- 重写方法 RenderContents,渲染控件的 HTML 代码和 JavaScript 代码。
- 重写方法 OnInit,初始化控件的属性和事件。
- 方法 _calendar_DayRender,设置日历表格中未来的日期的单元格背景色。
- 方法 _calendar_SelectedDateChanged,设置文本框中的日期和时间,以及隐藏字段的值。
- 方法 _hiddenField_ValueChanged,在隐藏字段的值发生变化时执行,设置文本框的值和选中的日期时间。
- 方法 _textBox_TextChanged,在文本框中的值发生变化时执行,设置日历的可见日期、选中日期、小时和分钟下拉列表框的值,以及隐藏字段的值。
Step 2:添加资源文件
在项目中添加两个资源文件,分别命名为 DateTimePicker.js 和 Calendar.css。这些文件是用于提供客户端所需的 JavaScript 和 CSS 样式表。
DateTimePicker.js 文件的代码如下:
function showCalendar() {
document.getElementById('calendarContainer').style.display = '';
var top = getAbsoluteTop(document.getElementById('calendar'));
var left = getAbsoluteLeft(document.getElementById('calendar'));
document.getElementById('calendarContainer').style.top = top + 'px';
document.getElementById('calendarContainer').style.left = left + 'px';
}
function getAbsoluteTop(element) {
var top = element.offsetTop;
while (element.offsetParent) {
element = element.offsetParent;
top += element.offsetTop;
}
return top;
}
function getAbsoluteLeft(element) {
var left = element.offsetLeft;
while (element.offsetParent) {
element = element.offsetParent;
left += element.offsetLeft;
}
return left;
}
Calendar.css 文件的代码如下:
table.calendar {
background-color: #fff;
border: 1px solid gray;
}
td.calendar-other-month {
color: #bbb;
}
td.calendar-weekend {
color: blue;
}
.div.calendar {
font-family: Arial, sans-serif;
font-size: .8em;
}
以上代码的作用如下:
- 方法 showCalendar,在点击日期图片时显示日历,设置日历容器的位置。
- 方法 getAbsoluteTop,计算 HTML 元素相对于文档的纵坐标。
- 方法 getAbsoluteLeft,计算 HTML 元素相对于文档的横坐标。
- CSS 样式名 calendar,设置日历表格的背景色和边框。
- CSS 样式名 calendar-other-month,设置日历表格中非本月日期的默认显示样式。
- CSS 样式名 calendar-weekend,设置日历表格中周末日期的默认显示样式。
- CSS 样式名 calendar,设置日历容器的字体和字号。
Step 3:测试自定义控件
在 ASP.NET 的 Web 表单页面中,添加下列代码,测试 DateTimePicker 自定义控件的使用效果:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="Test.WebForm1" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>WebForm1</title>
<link href="Calendar.css" rel="stylesheet" />
<script src="DateTimePicker.js"></script>
<script>
function onSubmit() {
var dateTimePicker = <%= dateTimePicker.ClientID %>;
alert(dateTimePicker.get_value());
return false;
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<test:DateTimePicker ID="dateTimePicker" runat="server" />
<br />
<input type="submit" value="Submit" onclick="return onSubmit();" />
</div>
</form>
</body>
</html>
以上代码的作用如下:
- 引入 Calendar.css 和 DateTimePicker.js 两个客户端资源文件。
- 客户端 JavaScript 代码 onSubmit,在提交表单时获取 DateTimePicker 控件的值,并弹出一个提示框。
- 在表单中添加 DateTimePicker 控件和提交按钮。
完成以上步骤,即可在网页上看到 DateTimePicker 控件的效果了。
总结
本文介绍了如何使用 ASP.NET 的自定义控件 DateTimePicker,实现日期和时间的选择功能。其中,需要掌握以下知识点:
- 如何创建自定义控件
