原创控件代码共享--日期选择控件(二)

翻译|其它|编辑:郝浩|2005-08-29 15:06:00.000|阅读 1249 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

紧接上文
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
   if(this.Page!=null)
   this.Page.VerifyRenderingInServerForm(this);
    base.AddAttributesToRender(writer);
}

/// <summary>
/// 重写<see cref="System.Web.UI.Control.OnPreRender"/>方法。
/// </summary>
/// <param name="e">包含事件数据的 <see cref="EventArgs"/> 对象。</param>


protected override void OnPreRender(EventArgs e)
{
  string strJS=@"<script language='javascript'>


//原创:贾世义 日期:2005-08-16 免费共享 v1.0
//邮箱:jsyhello76@126.com
//请尊重版权,可以随意使用,但请注明出处//


function InitYear(pName,start,length,y)
{
   var selYear=eval('document.forms[0].'+pName+'_year');
   var n=selYear.length;
   selYear.length=n+length+1;
   for (i=0;i<=length;i++)
    {
       selYear.options[n+i].value=(i+start);
       selYear.options[n+i].text=(i+start);
    }
   if (y==0)
   {
      selYear.selectedIndex =0;
    }
   else
   {
    if (y>start)
    {
      if (y-start<=length)
      {
        selYear.selectedIndex = n+y-start;
       }
     else
     {
      selYear.selectedIndex = length;
    }
   }
  }
}

function InitMonth(pName,m)
{
   var selMonth=eval('document.all.'+pName+'_month');
   var n=selMonth.length;
   selMonth.length=n+12;
   for (i=1;i<10;i++)
   {
     selMonth.options[n+i-1].value='0'+i;
     selMonth.options[n+i-1].text=i;
    }
  for (i=10;i<=12;i++)
  {
    selMonth.options[n+i-1].value=i;
    selMonth.options[n+i-1].text=i;
  }
  if (m==0)
  {
    selMonth.selectedIndex=0;
   }
  else
  {
    selMonth.selectedIndex = n+m-1;
   }
}

function InitDay(pName,d)
{
   var selDay=eval('document.all.'+pName+'_day');
   var n=selDay.length;
   selDay.length=n+31;
   for (i=1;i<10;i++)
   {
     selDay.options[n+i-1].value='0'+i;
     selDay.options[n+i-1].text=i;
   }
   for (i=10;i<=31;i++)
   {
    selDay.options[n+i-1].value=i;
    selDay.options[n+i-1].text=i;
   }
   if (d==0)
   {
     selDay.selectedIndex = 0;
   }
  else
  {
    selDay.selectedIndex = n+d-1;
   }
    dateChange(pName);
}

function dateChange(pName)
{
   var selYear=eval('document.forms[0].'+pName+'_year');
   var year=selYear.options[selYear.selectedIndex].value;
   if (year!='')
   {
     var selMonth=eval('document.all.'+pName+'_month');
     var month=selMonth.options[selMonth.selectedIndex].value;
   if (month!='')
   {
     var date=new Date(year,month,0);
     var day=date.getDate();
     var selDay=eval('document.all.'+pName+'_day');
     var tmp=1;
   if (selDay.selectedIndex>0)
   {
      tmp=selDay.options[selDay.selectedIndex].value;
    }
     selDay.length=day;
     for (i=1;i<10;i++)
     {
       selDay.options[i-1].value='0'+i;
       selDay.options[i-1].text=i;
     }
for (i=10;i<=day;i++)
{
   selDay.options[i-1].value=i;
   selDay.options[i-1].text=i;
}
 if (tmp>day)
  {
   selDay.selectedIndex=day-1;
}
 else
  {
     selDay.selectedIndex=tmp-1;
     }
   }
 }
}

</script>";
Page.RegisterClientScriptBlock("EnableDays",strJS);
base.OnPreRender(e);
}

/// <summary>
/// 将此控件呈现给指定的输出参数。
/// </summary>
/// <param name="writer"> 要写出到的 HTML 编写器 </param>

protected override void Render(HtmlTextWriter writer)
{
writer.Write("<table border='0' cellpadding='0' cellspacing='0'><tr><td nowrap align='left'>");
int y=0;
int m=0;
int d=0;
string str=Text;
if (str.Length>=4)
{
   y=Convert.ToInt32(str.Substring(0,4));
   if (str.Length>=7)
   {
     m=Convert.ToInt32(str.Substring(5,2));
     if (str.Length>=10)
     {
       d=Convert.ToInt32(str.Substring(8,2));
     }
   }
}
bool isDate=(DateFormat=="YMD");
if (Enabled)
{
    bool isNull=IsNull;
    writer.Write("<select name='"+this.UniqueID+"_year'");
    if (isDate)
    {
      writer.Write(" onchange=\"dateChange('"+this.UniqueID+"')\"");
     }
      writer.Write(">");
      if (isNull)
    {
       writer.Write("<option value=''></option>");
    }
       writer.Write("</select>年");
       if (DateFormat.Length>1)
        {
           writer.Write("<select name='"+this.UniqueID+"_month'");
           if (isDate)
            {
           writer.Write(" onchange=\"dateChange('"+this.UniqueID+"')\"");
            }
           writer.Write(">");
           if (isNull)
            {
        writer.Write("<option value=''></option>");
     }
    writer.Write("</select>月");
    writer.Write(@"
<script language='javascript'>
InitYear('"+this.UniqueID+"',"+Start.ToString()+","+Length.ToString()+","+y.ToString()+@");
InitMonth('"+this.UniqueID+"',"+m.ToString()+@");
</script>");
  if (isDate)
  {
    writer.Write("<select name='"+this.UniqueID+"_day'>");
    if (isNull)
    {
      writer.Write("<option value=''></option>");
     }
      writer.Write("</select>日");
      writer.Write(@"
      <script language='javascript'>
      InitDay('"+this.UniqueID+"',"+d.ToString()+@");
     </script>");
    }
  }
}
else
{
   if (y==0 || m==0)
    {
       writer.Write("&nbsp;");
     }
  else
   {
     writer.Write(y.ToString()+"年"+m.ToString()+"月");
     if (d!=0)
     {
       writer.Write(d.ToString()+"日");
     }
    }
}
writer.Write("</td></tr></table>");
}

public event EventHandler TextChanged;

/// <summary>
/// 当由类实现时,为 ASP.NET 服务器控件处理回发数据。
/// </summary>
/// <param name="postDataKey">控件的主要标识符</param>
/// <param name="postCollection">所有传入名称值的集合</param>
/// <returns>如果服务器控件的状态在回发发生后更改,则为 true;否则为 false。</returns>


public virtual bool LoadPostData(string postDataKey, NameValueCollection postCollection)
{
String presentValue = Text;
String postedValue = postCollection[postDataKey];

if (presentValue == null || !presentValue.Equals(postedValue))
{
   Text = postedValue;
   return true;
}

return false;
}


/// <summary>
/// 当由类实现时,用信号要求服务器控件对象通知 ASP.NET 应用程序该控件的状态已更改。
/// </summary>

public virtual void RaisePostDataChangedEvent()
{
OnTextChanged(EventArgs.Empty);
}


protected virtual void OnTextChanged(EventArgs e)
{
if (TextChanged != null)
TextChanged(this,e);
}
#endregion

}


#region 控件设计器

/// <summary>
/// 服务器控件设计器。
/// </summary>

public class DateDesigner:System.Web.UI.Design.WebControls.PanelDesigner
{
/// <summary>
/// 初始化 PagerDesigner 的新实例。
/// </summary>

public DateDesigner()
{
this.ReadOnly=true;
}
private JSYNetDate wb;

/// <summary>
/// 获取用于在设计时表示关联控件的 HTML。
/// </summary>
/// <returns>用于在设计时表示控件的 HTML。</returns>


public override string GetDesignTimeHtml()
{

wb=(JSYNetDate)Component;
wb.Text="";
StringWriter sw=new StringWriter();
HtmlTextWriter writer=new HtmlTextWriter(sw);
wb.RenderControl(writer);
return sw.ToString();
}

/// <summary>
/// 获取在呈现控件时遇到错误后在设计时为指定的异常显示的 HTML。
/// </summary>
/// <param name="e">要为其显示错误信息的异常。</param>
/// <returns>设计时为指定的异常显示的 HTML。</returns>

protected override string GetErrorDesignTimeHtml(Exception e)
{
   string errorstr="创建控件时出错:"+e.Message;
   return CreatePlaceHolderDesignTimeHtml(errorstr);
   }
 }
#endregion
}
==================================
把以上代码保存为一个文件,如:JSYNetDate.cs
使用csc /t:library /out:..\bin\JSY.dll /r:System.Web.dll /r:System.dll JSYNetDate.cs编译即可
===================================
请多留宝贵意见,我会继续努力
使用举例
<%@ Register TagPrefix="cc1" Namespace="JSY" Assembly="JSY" %>
<%@ Page language="c#"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>WebForm1</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body>
<form id="Form1" method="post" runat="server">
<div align="center"><br/><br/><br/><br/><br/>
<cc1:JSYNetDate id="JSYNetDate1" Length="50" IsNull="true" runat="server"></cc1:JSYNetDate>
<br/>
<asp:Button id="Button1" runat="server" Text="Button"></asp:Button>
</div>
</form>
</body>
</HTML>
 


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP