将模板列的CheckBox的AutoPostBack属性设置为true,因为在模板列中的控件没有事件,故在aspx页面写事件程序,同时将CheckBox的OnCheckedChanged事件设置为所需要的事件程序。示例如下:
void Check_Change(Object sender, EventArgs e)
{
TextBox txtDescription;
foreach(DataGridItem item in ItemsGrid.Items)
{
selection = (CheckBox)item.FindControl("chkEnabled");
txtDescription = (TextBox)item.FindControl("txtDescription");
if (selection.Checked) { txtDescription.Enabled=false; }
else { txtDescription.Enabled=true;}
}
}
这样,当选中CheckBox时,TextBox中的内容将不可编辑,这个例子的缺陷在于没有使用就javascript灵活,因为每次都要与服务器通信。
Asp.net的设计方式和设计理念和其他的如Asp,Jsp,Php,Perl
等都不一样,几乎是完全的面向对象设计!代码的复用就是其
中差异较大的特点之一,Asp.net除了可以用Include以外,还提供
了比较有特点的Web控件,包括:Ascx形式和带设计时支持的控
件[本文属于后者],为了熟悉这些新概念,我自己写了个Web控件。
在实际项目中运行使用良好,以后,要有时间,我还将不断改进。
ValidateCode控件的使用方法:
第一步:
编译我提供的原代码, 然后,在Studio.net 2003工具栏上, 选择"添加/移除项", 选中编译好的dll文件。
第二步:
工具栏上就会多一个Web控件ValidateCode,做好一个Web窗体,在Studio.net 2003开发界面上,直接把控件拖到WebForm上,就OK!
第三步:
在该控件的GraphicOK事件中获取,验证码的字符信息,用于和用户录入做比较!
最后一步:
在网站的根目录下,建一个temp目录(也可以自己指定目录),用于存放验证码
图片,不用担心,代码会自动删除无用的图片!
原代码如下:
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.IO;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
namespace WebValidateCode
{
/// <summary>
/// ValidateCode 的摘要说明。
/// 设计者:王海波 2004-11-20
/// </summary>
///
public enum GraphicType
{
Jpg = 0,
Gif = 1,
Png = 2,
Bmp = 3,
}
//[ToolboxBitmap(@"D:/DotnetApp/ValidateCode/ValidateCode.bmp") ] //设置控件在工具箱上的图标
public class ValidateCode : System.Web.UI.WebControls.WebControl ,INamingContainer
{
private int pCodelen=5;
private int pChartWidth=100;
private int pChartHeight=20;
private GraphicType pChartType;
private string pAuthenCode;
private string pTempImageURLPath="/temp";
private string pAuthenImageFullname;
private string pAuthenImageFullURL;
//生成校验码的变量 start
private Bitmap validateImage;
private Graphics g;
//生成校验码的变量 End
private TextBox txt=new TextBox();
private System.Web.UI.WebControls.Image img= new System.Web.UI.WebControls.Image();
#region 定义控件事件
public delegate void GraphicCreated(object sender, EventArgs e);
public event EventHandler GraphicOK; //在校验图片生成结束以后触发
protected virtual void OnGraphicOK(object sender, EventArgs e)
{
if (GraphicOK != null)
{
//Invokes the delegates.
GraphicOK(sender, e);
}
}
#endregion
#region 控件属性
//生成校验码的长度
[Bindable(true),Browsable(true),Category("Appearance"),DefaultValue(true),Description("需要验证码的长度,建议在5~8位之间!")]
public int CodeLength
{
get
{
return pCodelen;
}
set
{
pCodelen = value;
}
}
//生成校验码的长度
[Bindable(true),Browsable(true),Category("Appearance"),DefaultValue(true),Description("生成验证码图片的临时存放路径,要求必须是网站下的虚拟目录!")]
public string TempImageURLPath
{
get
{
return pTempImageURLPath;
}
set
{
pTempImageURLPath = value;
}
}
[Bindable(true),Browsable(true),Category("Appearance"),DefaultValue(GraphicType.Jpg),Description("选择生成校验图文件的类型(Jpg;Gif;Png;Bmp)!")]
public GraphicType ChartType
{
get
{
return pChartType;
}
set
{
pChartType = value;
}
}
//生成校验码图片的宽度
public int ChartWidth
{
get
{
return pChartWidth;
}
set
{
pChartWidth = value;
}
}
//生成校验码图片的高度
public int ChartHeight
{
get
{
return pChartHeight;
}
set
{
pChartHeight = value;
}
}
//需要生成的校验码
public string AuthenCode
{
get
{
return pAuthenCode;
}
set
{
pAuthenCode = value;
}
}
#endregion
/// <summary>
/// 将此控件呈现给指定的输出参数。
/// </summary>
/// <param name="output"> 要写出到的 HTML 编写器 </param>
protected override void Render(HtmlTextWriter output)
{
System.Web.UI.WebControls.Image objImage;
//TextBox objTxt;
//绘制包含的控件
objImage = (System.Web.UI.WebControls.Image) Controls[0];
//objTxt = (TextBox) Controls[1];
if(pAuthenCode==null)
pAuthenCode=GetValidateCode();
OnGraphicOK(this,EventArgs.Empty );
GetRandomImage(pAuthenCode);
objImage.ImageUrl=pAuthenImageFullURL;
objImage.RenderControl(output);
}
/// <summary>
/// 给控件添加子控件
/// </summary>
protected override void CreateChildControls( )
{
//Controls.Add(btn);
Controls.Add(img);
//Controls.Add(txt);
}
/// <summary>
/// 控件Load时候属性的初始化
/// </summary>
/// <param name="e"></param>
protected override void OnLoad(System.EventArgs e)
{
EraseOldGraphic(); //删除过期的图片
}
/// <summary>
/// 生成随机的
/// </summary>
private void MakeRandomFileName()
{
string strRandName=DateTime.Now.Ticks.ToString()+".jpg";
pAuthenImageFullname=this.Page.MapPath(TempImageURLPath)+@"/"+strRandName;
pAuthenImageFullURL=TempImageURLPath+"/"+strRandName;
}
private void GetRandomImage(string strValidateCode)
{
//生成随即图片的全名,和全URL
MakeRandomFileName();
validateImage = new Bitmap(pChartWidth, pChartHeight, PixelFormat.Format24bppRgb); // .Format24bppRgb);
g = Graphics.FromImage(validateImage);
g.Clear(Color.LightGray) ;
//g.DrawString(strValidateCode , new Font("宋体",16,FontStyle.Bold),new SolidBrush(Color.DarkRed),new PointF(2,2));
for(int i=0;i<strValidateCode.Length;i++)
{
Random r = new Random();
PointF startPos=new PointF(r.Next(3,6)+(r.Next(12,14)*i ),r.Next(-1,2) );
g.DrawString(strValidateCode.Substring(i,1) , new Font("宋体",14,FontStyle.Italic),new SolidBrush(Color.Blue),startPos);
}
//g.FillRectangle(new LinearGradientBrush(new Point(0,0), new Point(120,30), Color.FromArgb(0,0,0,0),Color.FromArgb(255,255,255,255)),0,0,120,30);
switch(pChartType)
{
case GraphicType.Jpg:
validateImage.Save(pAuthenImageFullname, ImageFormat.Jpeg);
break;
case GraphicType.Gif:
validateImage.Save(pAuthenImageFullname, ImageFormat.Gif);
break;
case GraphicType.Png:
validateImage.Save(pAuthenImageFullname, ImageFormat.Png);
break;
case GraphicType.Bmp:
validateImage.Save(pAuthenImageFullname, ImageFormat.Bmp);
break;
default:
validateImage.Save(pAuthenImageFullname, ImageFormat.Jpeg);
break;
}
validateImage.Dispose();
g.Dispose();
}
/// <summary>
/// 动态从数字和字母组成的元素中动态选择生成校验码
/// </summary>
private string GetValidateCode()
{
char[] s = new char[]{'0','1', '2','3','4','5','6','7','8','9','a'
,'b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q'
,'r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G'
,'H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W'
,'X','Y','Z'};
string num = "";
Random r = new Random();
//根据用户需要的长度来定义验证码的位数
for(int i = 0; i < CodeLength; i++)
{
num += s[r.Next(0, s.Length)].ToString();
}
return num;
}
/// <summary>
/// 清除时间超过20秒的临时图片记录
/// </summary>
/// <returns>成功返回true,失败返回false</returns>
public bool EraseOldGraphic()
{
try
{
DirectoryInfo Dinfo=new DirectoryInfo(this.Page.MapPath(pTempImageURLPath));
FileInfo[] FileSet;
if(Dinfo.Exists)
{
switch(pChartType)
{
case GraphicType.Jpg:
FileSet=Dinfo.GetFiles("*.jpg");
break;
case GraphicType.Gif:
FileSet=Dinfo.GetFiles("*.gif");
break;
case GraphicType.Png:
FileSet=Dinfo.GetFiles("*.png");
break;
case GraphicType.Bmp:
FileSet=Dinfo.GetFiles("*.bmp");
break;
default:
FileSet=Dinfo.GetFiles("*.jpg");
break;
}
foreach(FileInfo fileInfo in FileSet)
{
if(fileInfo.Exists)
{
DateTime dts=DateTime.Now;
DateTime dtc=fileInfo.CreationTime;
TimeSpan ts=dts-dtc;
if(ts.Seconds>20)
{
fileInfo.Delete();
}
}
}
}
return true;
}
catch(IOException ioe)
{
return false;
}
}
}
}
dgCategory是用于显示类别表的DataGrid
自动分页:AllowPaging= TRUE!!!!
private void dgCategory_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
{
dgCategory.CurrentPageIndex=e.NewPageIndex;
dgCategory.DataBind();
}
排序:默认按“PKId”排序
private void dgCategory_SortCommand(object source, System.Web.UI.WebControls.DataGridSortCommandEventArgs e)
{
string SortOrder=e.SortExpression.ToString();
BindData(SortOrder);
}
private void BindData(string SortOrder)
{
ProductSystem productSys=new ProductSystem();//底层数据接口
CategoryData categorySet=productSys.GetCategories(1); //底层数据接口,返回ID为1的Category
DataView categoryView=categorySet.Tables[CategoryData.CATEGORIES_TABLE].DefaultView;
categoryView.Sort=SortOrder;
lblTitle.Text="按"+SortOrder+"排序";
dgCategory.DataSource=categoryView;
dgCategory.DataBind();
}
private void Page_Load(object sender, System.EventArgs e)
{
BindData("PKId");
}
编辑,更新,取消:
private void dgCategory_EditCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
dgCategory.EditItemIndex=e.Item.ItemIndex;
BindData("PKId");
}
private void dgCategory_CancelCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
dgCategory.EditItemIndex=-1;
BindData("PKId");
}
private void dgCategory_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
string strUpdate="";
strUpdate+="PKId='"+((TextBox)e.Item.Cells[1].Controls[0]).Text+"'";
strUpdate+="ParentId='"+((TextBox)e.Item.Cells[2].Controls[0]).Text+"'";
strUpdate+="Description='"+((TextBox)e.Item.Cells[3].Controls[0]).Text+"'";
strUpdate+="IsLeaf='"+((TextBox)e.Item.Cells[4].Controls[0]).Text+"'";
try
{
CagegorySet.ExecuteUpdate(strUpdate);//需要后台提供更新的接口
dgCategory.EditItemIndex=-1;
}
catch
{
Response.Write("<script language='javascript'>alert('未能完成更新,请…………')</script>");
}
BindData("PKId");
}
private void dgCategory_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
//获得关键字,使用DataKeys集合访问数据列表控件中每个记录的键值(显示为一行)
//使得用户可以存储键字段而无需在控件中显示它
string PKId=dgCategory.DataKeys[e.Item.ItemIndex];
CategorySet.ExecuteDelete(PKId);
}*/