Blue Dream

记录成长的每一个脚印,写下漫长的程序人生
随笔 - 4, 文章 - 121, 评论 - 1, 阅读 - 89514
  首页  :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

用C#写一个Web自定义控件

Posted on   Dennis  阅读(961)  评论(0编辑  收藏  举报
原来写的用户控件,但是维护太麻烦,后来就写了一个自定义控件,比较好维护,使用也方便多了。 
该控件是一个时间控件,通过下拉列表框选择时间的年、月、日、时、分、秒。初始化时要提供可选时间的 
起始年份。 

源代码如下: 

using System;
 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.ComponentModel; 
using System.ComponentModel.Design; 

namespace UserTime 
{ 
/// <summary> 
/// 用户自定义时间控件,取到年、月、日、时、分、秒 
/// </summary> 
[DefaultProperty("Text"), 
ToolboxData("<{0}:clsUserTime runat=server></{0}:clsUserTime>")] 
//INamingContainer为子控件提供了一个新的命名范围,保证子控件的ID唯一性 
public class clsUserTime : System.Web.UI.WebControls.WebControl, INamingContainer 
{ 
private System.Web.UI.WebControls.DropDownList ddlYear; 
private DropDownList ddlMonth; 
private DropDownList ddlDay; 
private DropDownList ddlHour; 
private DropDownList ddlMinite; 
private DropDownList ddlSecond; 

private static int beginYear = 0; //起始年号,这里必须使用static以防二次调用后变量被清零 
private static bool IsInit = false; //是否已经初始化过,这里必须使用static以防二次调用后变量被清零 

public int Year //取控件时间:年 
{ 
get 
{ 
return ddlYear.SelectedIndex + beginYear; 
} 
} 

public int Month //取控件时间:月 
{ 
get 
{ 
return ddlMonth.SelectedIndex + 1; 
} 
} 

public int Day //取控件时间:日 
{ 
get 
{ 
return ddlDay.SelectedIndex + 1; 
} 
} 

public int Hour //取控件时间:时 
{ 
get 
{ 
return ddlHour.SelectedIndex; 
} 
} 

public int Minite //取控件时间:分 
{ 
get 
{ 
return ddlMinite.SelectedIndex; 
} 
} 

public int Second //取控件时间:秒 
{ 
get 
{ 
return ddlSecond.SelectedIndex; 
} 
} 

//用起始年号初始化控件,如果已经初始化过控件,直接返回 
public void InitControls(int startYear, int endYear) 
{ 
if (IsInit) 
{ 
return; 
} 
EnsureChildControls(); 
if (startYear > endYear) 
{ 
int tmp = startYear; 
startYear = endYear; 
endYear = startYear; 
} 
beginYear = startYear; 
for (int i = startYear; i <= endYear; ++i) 
{ 
ddlYear.Items.Add(i.ToString()); 
} 
for (int i = 1; i <=12; ++i) 
{ 
ddlMonth.Items.Add(i.ToString()); 
} 
for (int i = 1; i <= 31; ++i) 
{ 
ddlDay.Items.Add(i.ToString()); 
} 
for (int i = 0; i < 24; ++i) 
{ 
ddlHour.Items.Add(i.ToString()); 
} 
for (int i = 0; i < 60; ++i) 
{ 
ddlMinite.Items.Add(i.ToString()); 
ddlSecond.Items.Add(i.ToString()); 
} 
IsInit = true; 
} 
//重载Controls属性,取得ControlCollection对象,该对象表示UI层次结构中的服务器控件的子控件 
public override ControlCollection Controls 
{ 
get 
{ 
//确定服务器是否包含子控件 
EnsureChildControls(); 
return base.Controls; 
} 
} 

//动态创建子控件 
protected override void CreateChildControls() 
{ 
//创建年、月、日、时、分、秒下拉列表框 
this.Controls.Clear(); 
ddlYear = new DropDownList(); 
ddlYear.ID = "ddlYear"; 
ddlYear.Width = 54; 

ddlMonth = new DropDownList(); 
ddlMonth.ID = "ddlMonth"; 
ddlMonth.Width = 40; 

ddlDay = new DropDownList(); 
ddlDay.ID = "ddlDay"; 
ddlDay.Width = 40; 

ddlHour = new DropDownList(); 
ddlHour.ID = "ddlHour"; 
ddlHour.Width = 40; 

ddlMinite = new DropDownList(); 
ddlMinite.ID = "ddlMinite"; 
ddlMinite.Width = 40; 

ddlSecond = new DropDownList(); 
ddlSecond.ID = "ddlSecond"; 
ddlSecond.Width = 40; 

this.Controls.Add(ddlYear); 
this.Controls.Add(ddlMonth); 
this.Controls.Add(ddlDay); 
this.Controls.Add(ddlHour); 
this.Controls.Add(ddlMinite); 
this.Controls.Add(ddlSecond); 

base.CreateChildControls (); 
} 

/// <summary> 
/// 将此控件呈现给指定的输出参数。 
/// </summary> 
/// <param name="output"> 要写出到的 HTML 编写器 </param> 
protected override void Render(HtmlTextWriter output) 
{ 
//将要呈现的HTML属性添加到指定的System.Web.HtmlTextWriter中 
AddAttributesToRender(output); 
output.AddAttribute(System.Web.UI.HtmlTextWriterAttribute.Cellpadding, "0", false); 

//制定一个表,把子控件排在一行上 
output.RenderBeginTag(HtmlTextWriterTag.Table); //表 
output.RenderBeginTag(HtmlTextWriterTag.Tr); //行 

//年下拉列表框 
output.RenderBeginTag(HtmlTextWriterTag.Td); //列 
ddlYear.RenderControl(output); 
output.RenderEndTag(); 

output.RenderBeginTag(HtmlTextWriterTag.Td); 
output.Write("年"); 
output.RenderEndTag(); 

//月下拉列表框 
output.RenderBeginTag(HtmlTextWriterTag.Td); 
ddlMonth.RenderControl(output); 
output.RenderEndTag(); 

output.RenderBeginTag(HtmlTextWriterTag.Td); 
output.Write("月"); 
output.RenderEndTag(); 

//日下拉列表框 
output.RenderBeginTag(HtmlTextWriterTag.Td); 
ddlDay.RenderControl(output); 
output.RenderEndTag(); 

output.RenderBeginTag(HtmlTextWriterTag.Td); 
output.Write("日"); 
output.RenderEndTag(); 

//时下拉列表框 
output.RenderBeginTag(HtmlTextWriterTag.Td); 
ddlHour.RenderControl(output); 
output.RenderEndTag(); 

output.RenderBeginTag(HtmlTextWriterTag.Td); 
output.Write("时"); 
output.RenderEndTag(); 

//分下拉列表框 
output.RenderBeginTag(HtmlTextWriterTag.Td); 
ddlMinite.RenderControl(output); 
output.RenderEndTag(); 

output.RenderBeginTag(HtmlTextWriterTag.Td); 
output.Write("分"); 
output.RenderEndTag(); 

//秒下拉列表框 
output.RenderBeginTag(HtmlTextWriterTag.Td); 
ddlSecond.RenderControl(output); 
output.RenderEndTag(); 

output.RenderBeginTag(HtmlTextWriterTag.Td); 
output.Write("秒"); 
output.RenderEndTag(); 

output.RenderEndTag(); 
output.RenderEndTag(); 
} 

public DateTime GetTime() //取得选定的时间 
{ 
DateTime time = new DateTime(this.Year, this.Month, this.Day, this.Hour, this.Minite, this.Second, 0); 
return time; 
} 

//清除控件里所有下拉列表框的值 
public void ClearControls() 
{ 
ddlYear.Items.Clear(); 
ddlMonth.Items.Clear(); 
ddlDay.Items.Clear(); 
ddlHour.Items.Clear(); 
ddlMinite.Items.Clear(); 
ddlSecond.Items.Clear(); 
IsInit = false; 
} 

//撤消对所有下拉列表框的选项 
public void ClearSelection() 
{ 
ddlYear.ClearSelection(); 
ddlMonth.ClearSelection(); 
ddlDay.ClearSelection(); 
ddlHour.ClearSelection(); 
ddlMinite.ClearSelection(); 
ddlSecond.ClearSelection(); 
} 
} 
} 
[/color]



(评论功能已被禁用)
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示