zoukankan      html  css  js  c++  java
  • ASP.NET 简单的日历自定义控件

    项目中有许多页面都要用到日期选择框,为了统一管理,就制作了一个简单的自定义控件,效果如下:

    功能:鼠标点击输入框,弹出日期选择画面。

    后台和前台代码如下

    代码
    [DefaultProperty("Text")]
    [ToolboxData(
    "<{0}:ServerControl1 runat=server></{0}:ServerControl1>")]
    public class BTCalendar : CompositeControl
    {
    private TextBox tb;
    private Image img;
    private string javascriptFile = "~/js/JScript1.js";

    [Category(
    "基本设置")]
    [Browsable(
    true)]
    [Description(
    "日历控件所引用的javascript文件")]
    [Editor(
    "System.Web.UI.Design.UrlEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
    [DefaultValue(
    "~/js/JScript1.js")]
    public string JavascriptFile
    {
    get { return javascriptFile; }
    set { javascriptFile = value; }
    }

    [Category(
    "基本设置")]
    [Browsable(
    true)]
    [Editor(
    "System.Web.UI.Design.ImageUrlEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
    public string ImgFile { get; set; }

    protected override void CreateChildControls()
    {
    tb
    = new TextBox();
    tb.ID
    = "BTTextBox1";
    tb.Style.Add(HtmlTextWriterStyle.BorderWidth,
    "0");
    tb.Style.Add(HtmlTextWriterStyle.Width,
    "80%");
    tb.Attributes.Add(
    "onmousedown", "JCalendar.show(this);");
    this.Controls.Add(tb);

    img
    = new Image();
    img.ID
    = "BTImg1";
    img.ImageUrl
    = this.ImgFile;
    img.Style.Add(HtmlTextWriterStyle.VerticalAlign,
    "middle");
    this.Controls.Add(img);

    }
    protected override void OnPreRender(EventArgs e)
    {
    string file = base.ResolveUrl(JavascriptFile);
    Page.ClientScript.RegisterClientScriptBlock(
    this.GetType(), "b", "<script type='text/javascript' src='" + file + "'></script> ", false);
    base.OnPreRender(e);
    }
    protected override void Render(HtmlTextWriter writer)
    {
    writer.AddStyleAttribute(HtmlTextWriterStyle.BorderWidth,
    "1px");
    writer.AddStyleAttribute(HtmlTextWriterStyle.BorderStyle,
    "solid");
    writer.AddStyleAttribute(HtmlTextWriterStyle.BorderColor,
    "#ddd");
    writer.AddAttribute(HtmlTextWriterAttribute.Style,
    "140px;");
    writer.AddAttribute(HtmlTextWriterAttribute.Id,
    "divDate");
    writer.RenderBeginTag(HtmlTextWriterTag.Div);

    tb.RenderControl(writer);
    img.RenderControl(writer);

    writer.RenderEndTag();
    }
    }

    前途javascript代码如下

    代码
    var tdSelected = "<span id='c_today' style='background-color:#036;color:#FFF;'>";
    var tdNormal = "<div onmouseover=\"this.style.backgroundColor='#CCC'\" onmouseout=\"this.style.backgroundColor=''\" onmousedown='JCalendar.mousedown(this)'>";
    var globalDiv;

    var JCalendar = function (obj) {

    var arr = obj.value.split("-");
    var _date = arr.length == 3 ? new Date(arr[0], arr[1] - 1, arr[2]) : new Date();


    var y = _date.getFullYear();
    var m = _date.getMonth();
    var d = _date.getDate();

    JCalendar.date
    = _date;
    JCalendar.yyyy
    = y;
    JCalendar.mm
    = m + 1;
    JCalendar.dd
    = d;
    JCalendar.fday
    = new Date(y, m, 1).getDay();
    JCalendar.dayNum
    = new Date(y, m + 1, 0).getDate();

    JCalendar.target
    = obj;
    //obj.onblur = JCalendar.hide;
    }


    JCalendar.hide
    = function () {
    if (globalDiv) {
    globalDiv.style.visibility
    = "hidden";
    }
    }
    JCalendar.show
    = function (obj) {
    JCalendar(obj);
    var fd = JCalendar.fday;
    var date = new Array(JCalendar.fday > 0 ? JCalendar.fday : 0); //预先定义一段空数组,对应日历里第一周空的位置
    var html_str = new Array();
    var date_index = 0;
    var weekDay = ["", "", "", "", "", "", ""];
    for (var j = 1; j <= JCalendar.dayNum; j++) {
    date.push(j);
    }
    html_str.push(
    "<table id='calendar'>");
    html_str.push(
    "<caption><span title='上一年份' onmouseover=\"this.style.color='#F90'\" onmouseout=\"this.style.color='#09F'\" onclick=\"JCalendar.update(-12);return false\" style='color:#09F;font-size:16px;margin-right:5px;'>&laquo;</span><span title='上一月份' onmouseover=\"this.style.color='#F90'\" onmouseout=\"this.style.color='#09F'\" onclick=\"JCalendar.update(-1);return false\" style='margin-right:15px;color:#09F;'>▲</span><span id='calendar_title'>" + JCalendar.yyyy + "" + JCalendar.mm + "月</span><span title='下一月份' onclick=\"JCalendar.update(1);return false\" onmouseover=\"this.style.color='#F90'\" onmouseout=\"this.style.color='#09F'\" style='margin-left:15px;color:#09F;'>▼</span><span title='下一年份' onclick=\"JCalendar.update(12);return false\" onmouseover=\"this.style.color='#F90'\" onmouseout=\"this.style.color='#09F'\" style='font-size:16px;margin-left:5px;color:#09F;'>&raquo;</span></caption>");
    html_str.push(
    "<thead><tr>");
    for (var i = 0; i < 7; i++) {//填充日历头
    html_str.push("<td>" + weekDay[i] + "</td>");
    }
    html_str.push(
    "</tr></thead>");
    html_str.push(
    "<tbody>");
    for (var i = 0; i < 6; i++) {//填充日期
    html_str.push("<tr>");
    for (var j = 0; j < 7; j++) {
    tmp
    = date[date_index++];
    tmp
    = tmp ? tmp : "";
    if (JCalendar.dd == tmp)
    html_str.push(
    "<td>" + tdSelected + JCalendar.dd + "</span></td>");
    else if (tmp == "")
    html_str.push(
    "<td></td>");
    else
    html_str.push(
    "<td>" + tdNormal + tmp + "</div></td>");
    }
    html_str.push(
    "</tr>");
    }
    html_str.push(
    "</tbody></table>");

    if (!globalDiv) {
    globalDiv
    = document.createElement("div");
    globalDiv.id
    = "divDate";
    globalDiv.style.position
    = "absolute";
    globalDiv.style.backgroundColor
    = "gray";
    document.body.appendChild(globalDiv);
    }
    var rect = obj.getBoundingClientRect();
    globalDiv.innerHTML
    = html_str.join("");
    globalDiv.style.left
    = rect.left + "px";
    globalDiv.style.top
    = rect.top + rect.height + "px";
    globalDiv.style.visibility
    = "visible";
    event.cancelBubble
    = true;
    }

    //静态方法
    JCalendar.update = function (_month) {
    var date = new Date(JCalendar.yyyy, JCalendar.mm - 1 + _month, 1);
    var fday = date.getDay(); //每月第一天的星期数
    var year = date.getFullYear();
    var month = date.getMonth() + 1;
    var dayNum = new Date(JCalendar.yyyy, JCalendar.mm + _month, 0).getDate(); //每月的天数
    var tds = document.getElementById("calendar").getElementsByTagName("td");
    for (var i = 7; i < tds.length; i++)//清空日历内容
    tds[i].innerHTML = "";
    document.getElementById(
    "calendar_title").innerHTML = year + "" + month + ""; //更新显示年月
    //更新当前年月
    JCalendar.yyyy = year;
    JCalendar.mm
    = month;
    for (var j = 1; j <= dayNum; j++) {
    if (j == JCalendar.dd)
    tds[
    6 + fday + j].innerHTML = tdSelected + JCalendar.dd + "</span>";
    else
    tds[
    6 + fday + j].innerHTML = tdNormal + j + "</div>";
    }
    JCalendar.onupdate(year, month, JCalendar.dd);
    }

    JCalendar.mousedown
    = function (obj) {
    var tmp = document.getElementById("c_today");
    tmp.parentNode.innerHTML
    = tdNormal + tmp.innerHTML + "</div>";
    JCalendar.dd
    = parseInt(obj.innerHTML);
    obj.parentNode.innerHTML
    = tdSelected + obj.innerHTML + "</span>";
    JCalendar.onmousedown(JCalendar.yyyy, JCalendar.mm, JCalendar.dd);
    }

    JCalendar.onmousedown
    = function (year, month, date) {
    JCalendar.target.value
    = year + "-" + month + "-" + date;
    JCalendar.hide();
    }
  • 相关阅读:
    20180320作业2:进行代码复审训练
    20180320作业1:源代码管理工具调查
    软工作业PSP与单元测试练习
    软工课后作业01-P18第四题
    20180320作业2:进行代码复审训练
    判断传入的电子邮箱账号的正确性
    软工课后作业01-00365
    实现模块判断传入的电子邮箱账号的正确性
    个人介绍
    20180320作业2:进行代码复审训练
  • 原文地址:https://www.cnblogs.com/cnbwang/p/1890132.html
Copyright © 2011-2022 走看看