DropDownCalendar.cs
上传用户:li2971742
上传日期:2021-11-18
资源大小:39096k
文件大小:19k
源码类别:

OA系统

开发平台:

C#

  1. using System;
  2. using System.Web.UI;
  3. using System.Web.UI.WebControls;
  4. using System.ComponentModel;
  5. using System.Collections;
  6. using System.Collections.Specialized;
  7. namespace OThinker.H3.WorkSheet
  8. {
  9. [DefaultProperty("Text"), 
  10. ToolboxData("<{0}:DropDownCalendar runat=server></{0}:DropDownCalendar>")]
  11. public class DropDownCalendar : System.Web.UI.WebControls.WebControl, IPostBackDataHandler
  12. {
  13. //private string size;
  14. private string size;
  15.         private TextBox TextBox;
  16.         public DropDownCalendar()
  17.         {
  18.             this.TextBox = new TextBox();
  19.             this.TextBox.Attributes.Add("Id", this.ID);
  20.             this.TextBox.Attributes.Add("Name", this.ID);
  21.             //if (this.CssClass != "") { this.TextBox.Attributes.Add(HtmlTextWriterAttribute.Class, this.CssClass); }
  22.             //if (this.Text != "" && this.Text != null) { this.TextBox.Attributes.Add(HtmlTextWriterAttribute.Value, this.Text); }
  23.             //if (this.Size != "" && this.Size != null) { this.TextBox.Attributes.Add(HtmlTextWriterAttribute.Size, this.Size); }
  24.             this.TextBox.Attributes.Add("Style", "cursor:hand");
  25.             // output.AddAttribute(HtmlTextWriterAttribute.Type, "text");
  26.             this.TextBox.Attributes.Add("ReadOnly", "true");
  27.             this.TextBox.Attributes.Add("Onclick", "javascript:this.focus()");
  28.             this.TextBox.Attributes.Add("onFocus", "fPopCalendar(this,this,PopCal); return false;");
  29.             this.Controls.Add(this.TextBox);
  30.         }
  31. [Bindable(true), Category("Appearance"), DefaultValue("")] 
  32. public string Text 
  33. {
  34. get
  35. {
  36.                 return this.TextBox.Text;
  37. }
  38. set
  39. {
  40.                 this.TextBox.Text = value;
  41. }
  42. }
  43. [Bindable(true), Category("Appearance"), DefaultValue("")] 
  44. public string Size
  45. {
  46. get
  47. {
  48. return size;
  49. }
  50. set
  51. {
  52. size = value;
  53. }
  54. }
  55. /// <summary> 
  56. /// 将此控件呈现给指定的输出参数。
  57. /// </summary>
  58. /// <param name="output"> 要写出到的 HTML 编写器 </param>
  59. protected override void Render(HtmlTextWriter output)
  60. {
  61.             this.TextBox.Width = this.Width;
  62.             this.TextBox.RenderControl(output);
  63. if(!this.Page.IsClientScriptBlockRegistered("clientScript"))
  64. {
  65. output.WriteLine("<script language="JavaScript">");
  66. output.WriteLine("var gdCtrl = new Object();");
  67. output.WriteLine("var gcGray = "#808080";"); //非当前月应有日期字的颜色
  68. output.WriteLine("var gcToggle = "highlight";"); //鼠标所在日期单元格的底色
  69. output.WriteLine("var gcBG = "threedface";"); //日历背景色
  70. output.WriteLine("var gMonths = new Array("一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月");");
  71. output.WriteLine("var gdCurDate = new Date();"); //gdCurDate--当前日期
  72. output.WriteLine("var giYear = gdCurDate.getFullYear();"); //giYear--当前年份
  73. output.WriteLine("var giMonth = gdCurDate.getMonth()+1;"); //giMonth--当前月份(因为getMonth()返回的是0-11间的整数,故当前月要加1)
  74. output.WriteLine("var giDay = gdCurDate.getDate();"); //giDay--当前日
  75. output.WriteLine("var sxYear = giYear;"); //sxYear--所选年份
  76. output.WriteLine("var sxMonth = giMonth;"); //sxMonth--所选月份
  77. output.WriteLine("var sxDay = giDay;"); //sxDay--所选日
  78. output.WriteLine("var sxDatestr = gdCtrl.value;"); //以前所选日期
  79. output.WriteLine("if (sxDatestr != ""){");
  80. output.WriteLine("var sxDate = new Date(sxDatestr);");
  81. output.WriteLine("sxYear = sxDate.getFullYear();");
  82. output.WriteLine("}");
  83. output.WriteLine("var VicPopCal = new Object();");
  84. #region 鼠标异动到某对象上的一系列函数
  85. output.WriteLine("function mouseover(obj){");
  86. output.WriteLine("obj.style.borderTop = 'buttonshadow 1px solid';");
  87. output.WriteLine("obj.style.borderLeft = 'buttonshadow 1px solid';");
  88. output.WriteLine("obj.style.borderRight = 'buttonhighlight 1px solid';");
  89. output.WriteLine("obj.style.borderBottom = 'buttonhighlight 1px solid';");
  90. output.WriteLine("}");
  91. output.WriteLine("function mouseout(obj){");
  92. output.WriteLine("obj.style.borderTop = 'buttonhighlight 1px solid';");
  93. output.WriteLine("obj.style.borderLeft = 'buttonhighlight 1px solid';");
  94. output.WriteLine("obj.style.borderRight = 'buttonshadow 1px solid';");
  95. output.WriteLine("obj.style.borderBottom = 'buttonshadow 1px solid';");
  96. output.WriteLine("}");
  97. output.WriteLine("function mousedown(obj){");
  98. output.WriteLine("obj.style.borderTop = 'buttonshadow 1px solid';");
  99. output.WriteLine("obj.style.borderLeft = 'buttonshadow 1px solid';");
  100. output.WriteLine("obj.style.borderRight = 'buttonhighlight 1px solid';");
  101. output.WriteLine("obj.style.borderBottom = 'buttonhighlight 1px solid';");
  102. output.WriteLine("}");
  103. output.WriteLine("function mouseup(obj){");
  104. output.WriteLine("obj.style.borderTop = 'buttonhighlight 1px solid';");
  105. output.WriteLine("obj.style.borderLeft = 'buttonhighlight 1px solid';");
  106. output.WriteLine("obj.style.borderRight = 'buttonshadow 1px solid';");
  107. output.WriteLine("obj.style.borderBottom = 'buttonshadow 1px solid';");
  108. output.WriteLine("}");
  109. #endregion
  110. #region 日历操作的一系列函数
  111. output.WriteLine("function fPopCalendar(popCtrl, dateCtrl, popCal){");
  112. output.WriteLine("if (parent != null && parent.event != null){");
  113. output.WriteLine("parent.event.cancelBubble=true;");
  114. output.WriteLine("}");
  115. output.WriteLine("VicPopCal = popCal;");
  116. output.WriteLine("gdCtrl = dateCtrl;");
  117. output.WriteLine("fSetYearMon(giYear, giMonth);");
  118. output.WriteLine("var point = fGetXY(popCtrl);");
  119. output.WriteLine("with (VicPopCal.style) {left = point.x;top  = point.y+popCtrl.offsetHeight+1;visibility = 'visible';}");
  120. output.WriteLine("VicPopCal.focus();");
  121. output.WriteLine("}");
  122. output.WriteLine("function fSetDate(iYear, iMonth, iDay){");
  123. output.WriteLine("if ((iYear == 0) && (iMonth == 0) && (iDay == 0)){");
  124. output.WriteLine("gdCtrl.value = "";");
  125. output.WriteLine("}");
  126. output.WriteLine("else{");
  127. output.WriteLine("if (iMonth < 10){iMonth = "0"+iMonth;}"); //规格化时间
  128. output.WriteLine("if (iDay < 10){iDay = "0"+iDay;}");
  129. output.WriteLine("gdCtrl.value = iYear+"-"+iMonth+"-"+iDay;");
  130. output.WriteLine("}");
  131. output.WriteLine("VicPopCal.style.visibility = "hidden";");
  132. output.WriteLine("}");
  133. output.WriteLine("function fSetSelected(aCell){");
  134. output.WriteLine("var iOffset = 0;");
  135. output.WriteLine("var iYear = parseInt(document.all.tbSelYear.value);");
  136. output.WriteLine("var iMonth = parseInt(document.all.tbSelMonth.value);");
  137. output.WriteLine("aCell.bgColor = gcBG;");
  138. output.WriteLine("with (aCell.children["cellText"]){");
  139. output.WriteLine("var iDay = parseInt(innerText);");
  140. output.WriteLine("if (color==gcGray){iOffset = (Victor<10)?-1:1;}");
  141. output.WriteLine("iMonth += iOffset;");
  142. output.WriteLine("if (iMonth<1) { iYear--; iMonth = 12;}else{if (iMonth>12){iYear++;iMonth = 1;}}");
  143. output.WriteLine("}");
  144. output.WriteLine("fSetDate(iYear, iMonth, iDay);");
  145. output.WriteLine("}");
  146. output.WriteLine("function Point(iX, iY){this.x = iX;this.y = iY;}");
  147. output.WriteLine("function fBuildCal(iYear, iMonth){");
  148. output.WriteLine("var aMonth=new Array();");
  149. output.WriteLine("for(i=1;i<7;i++){aMonth[i]=new Array(i);}");
  150. output.WriteLine("var dCalDate=new Date(iYear, iMonth-1, 1);");
  151. output.WriteLine("var iDayOfFirst=dCalDate.getDay();");
  152. output.WriteLine("var iDaysInMonth=new Date(iYear, iMonth, 0).getDate();");
  153. output.WriteLine("var iOffsetLast=new Date(iYear, iMonth-1, 0).getDate()-iDayOfFirst+1;");
  154. output.WriteLine("var iDate = 1;");
  155. output.WriteLine("var iNext = 1;");
  156. output.WriteLine("for (d = 0; d < 7; d++){aMonth[1][d] = (d<iDayOfFirst)?-(iOffsetLast+d):iDate++;}");
  157. output.WriteLine("for (w = 2; w < 7; w++){for (d = 0; d < 7; d++){aMonth[w][d] = (iDate<=iDaysInMonth)?iDate++:-(iNext++);}}");
  158. output.WriteLine("return aMonth;");
  159. output.WriteLine("}");
  160. output.WriteLine("function fDrawCal(iYear, iMonth, iDay, iCellWidth, iDateTextSize) {");
  161. output.WriteLine("var WeekDay = new Array("日","一","二","三","四","五","六");");
  162. output.WriteLine("var styleTD = " bgcolor='"+gcBG+"' width='"+iCellWidth+"' bordercolor='"+gcBG+"' valign='middle' align='center' style='font-size: 12px;background: buttonface;border-top: buttonhighlight 1px solid;border-left: buttonhighlight 1px solid;border-right: buttonshadow 1px solid; border-bottom: buttonshadow 1px solid;";");
  163. output.WriteLine("with (document) {");
  164. output.WriteLine("write("<tr align='center'>");");
  165. output.WriteLine("for(i=0; i<7; i++){write("<td height='20' "+styleTD+"color:#990099' >" + WeekDay[i] + "</td>");}");
  166. output.WriteLine("write("</tr>");");
  167. output.WriteLine("for (w = 1; w < 7; w++) {");
  168. output.WriteLine("write("<tr align='center'>");");
  169. output.WriteLine("for (d = 0; d < 7; d++) {");
  170. output.WriteLine("write("<td width='10%' height='15' id=calCell "+styleTD+"cursor:hand;' onmouseover='mouseover(this)' onmouseout='mouseout(this)' onmousedown='mousedown(this)' onmouseup='mouseup(this)' onclick='fSetSelected(this)'>");");
  171. output.WriteLine("write("<font style='font-size: 13px;' id=cellText Victor='Liming Weng'> </font>");");
  172. output.WriteLine("write("</td>");");
  173. output.WriteLine("}");
  174. output.WriteLine("write("</tr>");");
  175. output.WriteLine("}");
  176. output.WriteLine("}");
  177. output.WriteLine("}");
  178. output.WriteLine("function fUpdateCal(iYear, iMonth) {");
  179. output.WriteLine("sxYear = iYear;");
  180. output.WriteLine("sxMonth = iMonth;");
  181. output.WriteLine("yeartd1.innerText = sxYear + "年";");
  182. output.WriteLine("monthtd1.innerText = gMonths[sxMonth-1];");
  183. output.WriteLine("myMonth = fBuildCal(iYear, iMonth);");
  184. output.WriteLine("var i = 0;");
  185. output.WriteLine("for (w = 0; w < 6; w++){");
  186. output.WriteLine("for (d = 0; d < 7; d++){");
  187. output.WriteLine("with (cellText[(7*w)+d]) {");
  188. output.WriteLine("Victor = i++;");
  189. output.WriteLine("if (myMonth[w+1][d]<0) {");
  190. output.WriteLine("color = gcGray;");
  191. output.WriteLine("innerText = -myMonth[w+1][d];");
  192. output.WriteLine("}else{");
  193. output.WriteLine("color = ((d==0)||(d==6))?"red":"black";");
  194. output.WriteLine("innerText = myMonth[w+1][d];");
  195. output.WriteLine("}");
  196. output.WriteLine("}");
  197. output.WriteLine("}");
  198. output.WriteLine("}");
  199. output.WriteLine("}");
  200. //设置列表框中的年份和月份
  201. output.WriteLine("function fSetYearMon(iYear, iMon){");
  202. output.WriteLine("sxYear = iYear;");
  203. output.WriteLine("sxMonth = iMon;");
  204. output.WriteLine("yeartd1.innerText = sxYear + "年";");
  205. output.WriteLine("monthtd1.innerText = gMonths[sxMonth-1];");
  206. output.WriteLine("document.all.tbSelMonth.options[iMon-1].selected = true;");
  207. output.WriteLine("for (i = 0; i < document.all.tbSelYear.length; i++){");
  208. output.WriteLine("if (document.all.tbSelYear.options[i].value == iYear){");
  209. output.WriteLine("document.all.tbSelYear.options[i].selected = true;");
  210. output.WriteLine("}");
  211. output.WriteLine("}");
  212. output.WriteLine("fUpdateCal(iYear, iMon);");
  213. output.WriteLine("}");
  214. output.WriteLine("function fPrevMonth(){");
  215. output.WriteLine("var iMon = document.all.tbSelMonth.value;");
  216. output.WriteLine("var iYear = document.all.tbSelYear.value;");
  217. output.WriteLine("if (--iMon<1) {");
  218. output.WriteLine("iMon = 12;");
  219. output.WriteLine("iYear--;");
  220. output.WriteLine("}");
  221. output.WriteLine("fSetYearMon(iYear, iMon);");
  222. output.WriteLine("}");
  223. output.WriteLine("function fNextMonth(){");
  224. output.WriteLine("var iMon = document.all.tbSelMonth.value;");
  225. output.WriteLine("var iYear = document.all.tbSelYear.value;");
  226. output.WriteLine("if (++iMon>12) {");
  227. output.WriteLine("iMon = 1;");
  228. output.WriteLine("iYear++;");
  229. output.WriteLine("}");
  230. output.WriteLine("fSetYearMon(iYear, iMon);");
  231. output.WriteLine("}");
  232. output.WriteLine("function fGetXY(aTag){");
  233. output.WriteLine("var oTmp = aTag;");
  234. output.WriteLine("var pt = new Point(0,0);");
  235. output.WriteLine("do {");
  236. output.WriteLine("pt.x += oTmp.offsetLeft;");
  237. output.WriteLine("pt.y += oTmp.offsetTop;");
  238. output.WriteLine("oTmp = oTmp.offsetParent;");
  239. output.WriteLine("} while(oTmp.tagName!="BODY");");
  240. output.WriteLine("return pt;");
  241. output.WriteLine("}");
  242. #endregion
  243. #region 日历体
  244. output.WriteLine("with (document){");
  245. output.WriteLine("write("<Div id='PopCal' onclick='event.cancelBubble=true' style='POSITION:absolute; VISIBILITY: hidden; bordercolor:#000000;border:2px ridge;width:10;z-index:100;'>");");
  246. //增加一个iframe可以解决被select遮挡的问题
  247. output.WriteLine("write("<iframe frameBorder=0 width=180 scrolling=no height=170></iframe>")");
  248. //修改table
  249. output.WriteLine("write("<table id='popTable' border='1' bgcolor='#eeede8' cellpadding='0' cellspacing='0' style='font-size:12px;Z-INDEX:202;position:absolute;top:0;left:0;'>");");
  250. //原table
  251. //output.WriteLine("write("<table id='popTable' border='1' bgcolor='#eeede8' cellpadding='0' cellspacing='0' style='font-size:12px'>");");
  252. output.WriteLine("write("<TR>");");
  253. output.WriteLine("write("<td valign='middle' align='center' style='cursor:default'>");");
  254. //日历头
  255. output.WriteLine("write("<table width='176' border='0' cellpadding='0' cellspacing='0'>");");
  256. output.WriteLine("write("<tr align='center'>");");
  257. //上一个月
  258. output.WriteLine("write("<td height='22' width='20' name='PrevMonth' style='font-family:\"webdings\";font-size:15px' onClick='fPrevMonth()' onmouseover='this.style.color=\"#ff9900\"' onmouseout='this.style.color=\"\"'>3</td>");");
  259. //显示和选择年份----------
  260. //显示年份
  261. output.WriteLine("write("<td width='64' id='yeartd1' style='font-size:12px' onmouseover='yeartd1.style.display=\"none\";yeartd2.style.display=\"\";' onmouseout='this.style.background=\"\"'>");");
  262. output.WriteLine("write(sxYear + "年");");
  263. output.WriteLine("write("</td>");");
  264. //年份选择
  265. output.WriteLine("write("<td width='64' id='yeartd2' style='display:none' onmouseout='yeartd2.style.display=\"none\";yeartd1.style.display=\"\";'>");");
  266. output.WriteLine("write("<SELECT style='width:64px;font-size: 12px;font-family: 宋体;' id='tbSelYear' onChange='fUpdateCal(document.all.tbSelYear.value, document.all.tbSelMonth.value);yeartd2.style.display=\"none\";yeartd1.style.display=\"\";' Victor='Won'>");");
  267. output.WriteLine("for(i=1930;i<2015;i++){");
  268. output.WriteLine("write("<OPTION value='"+i+"'>"+i+"年</OPTION>");");
  269. output.WriteLine("}");
  270. output.WriteLine("write("</SELECT>");");
  271. output.WriteLine("write("</td>");");
  272. //显示和选择月份----------
  273. //显示月份
  274. output.WriteLine("write("<td width='72' id='monthtd1' style='font-size:12px' onmouseover='monthtd1.style.display=\"none\";monthtd2.style.display=\"\";' onmouseout='this.style.background=\"\"'>");");
  275. output.WriteLine("write(gMonths[sxMonth-1]);");
  276. output.WriteLine("write("</td>");");
  277. //月份选择
  278. output.WriteLine("write("<td width='72' id='monthtd2' style='display:none' onmouseout='monthtd2.style.display=\"none\";monthtd1.style.display=\"\";'>");");
  279. output.WriteLine("write("<select style='width:72px;font-size: 12px;font-family: 宋体;' id='tbSelMonth' onChange='fUpdateCal(document.all.tbSelYear.value, document.all.tbSelMonth.value);monthtd2.style.display=\"none\";monthtd1.style.display=\"\";' Victor='Won'>");");
  280. output.WriteLine("for (i=0; i<12; i++){");
  281. output.WriteLine("write("<option value='"+(i+1)+"'>"+gMonths[i]+"</option>");");
  282. output.WriteLine("}");
  283. output.WriteLine("write("</SELECT>");");
  284. output.WriteLine("write("</td>");");
  285. //下一个月
  286. output.WriteLine("write("<td width='20' name='PrevMonth' style='font-family:\"webdings\";font-size:15px' onclick='fNextMonth()' onmouseover='this.style.color=\"#ff9900\"' onmouseout='this.style.color=\"\"'>4</td>");");
  287. output.WriteLine("write("</tr>");");
  288. output.WriteLine("write("</table>");");
  289. //----------------------------日历头结束----------------
  290. output.WriteLine("write("</td></TR><TR><td align='center'>");");
  291. output.WriteLine("write("<DIV style='background-color:teal;'><table width='100%' border='0' bgcolor='threedface' cellpadding='0' cellspacing='0'>");");
  292. output.WriteLine("fDrawCal(giYear, giMonth, giDay, 19, 14);");
  293. output.WriteLine("write("</table></DIV>");");
  294. output.WriteLine("write("</td></TR><TR><TD height='20' align='center' valign='bottom'>");");
  295. output.WriteLine("write("<font style='cursor:hand;font-size:12px' onclick='fSetDate(0,0,0)' onMouseOver='this.style.color=\"#0033FF\"' onMouseOut='this.style.color=0'>清空</font>");");
  296. output.WriteLine("write("&nbsp;&nbsp;&nbsp;&nbsp;");");
  297. output.WriteLine("write("<font style='cursor:hand;font-size:12px' onclick='fSetDate(giYear,giMonth,giDay)' onMouseOver='this.style.color=\"#0033FF\"' onMouseOut='this.style.color=0'>今天: "+giYear+"-"+giMonth+"-"+giDay+"</font>");");
  298. output.WriteLine("write("</TD></TR></TD></TR></TABLE>");");
  299. output.WriteLine("write("</Div>");");
  300. output.WriteLine("}");
  301. #endregion
  302. output.WriteLine("</script>");
  303. output.WriteLine("<SCRIPT event=onclick() for=document>PopCal.style.visibility = 'hidden';</SCRIPT>");
  304. this.Page.RegisterClientScriptBlock("clientScript", "");
  305. }
  306. }
  307. #region IPostBackDataHandler 成员
  308. public event EventHandler TextChanged;
  309. /// <summary>
  310. /// 当由类实现时,为 ASP.NET 服务器控件处理回发数据。
  311. /// </summary>
  312. /// <param name="postDataKey">控件的主要标识符</param>
  313. /// <param name="postCollection">所有传入名称值的集合</param>
  314. /// <returns>如果服务器控件的状态在回发发生后更改,则为 true;否则为 false。</returns>
  315. public virtual bool LoadPostData(string postDataKey, NameValueCollection postCollection) 
  316. {
  317. String presentValue = Text;
  318. String postedValue = postCollection[postDataKey];
  319. if (presentValue == null || !presentValue.Equals(postedValue)) 
  320. {
  321. Text = postedValue;
  322. return true;
  323. }
  324. return false;
  325. }
  326. /// <summary>
  327. /// 当由类实现时,用信号要求服务器控件对象通知 ASP.NET 应用程序该控件的状态已更改。
  328. /// </summary>
  329. public virtual void RaisePostDataChangedEvent() 
  330. {
  331. OnTextChanged(EventArgs.Empty);
  332. }
  333. protected virtual void OnTextChanged(EventArgs e) 
  334. {
  335. if (TextChanged != null)
  336. TextChanged(this,e);
  337. }
  338. #endregion
  339. }
  340. }