DataGrid模板列应用——在DataGrid中用CheckBox控制TextBox的Enabled属性

本文围绕ASP.NET开发展开,介绍了模板列CheckBox事件设置,选中时使TextBox不可编辑,但与服务器通信不够灵活。还展示了自定义Web控件ValidateCode的使用方法,包括编译、添加到工具栏等步骤。此外,讲解了DataGrid的自动分页、排序、编辑、更新、取消和删除等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将模板列的CheckBoxAutoPostBack属性设置为true,因为在模板列中的控件没有事件,故在aspx页面写事件程序,同时将CheckBoxOnCheckedChanged事件设置为所需要的事件程序。示例如下:

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);

}*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值