欢迎光临
我们一直在努力

深入理解C#编程中的组件-事件-委托-.NET教程,C#语言

建站超值云服务器,限时71元/月

在组件编程中对事件的理解是十分重要的,c# 中的“事件”是当对象发生某些有趣的事情时,类向该类的客户提供通知的一种方法。与事件联系最为紧密的,个人认为是委托.委托可以将方法引用封装在委托对象内。为了弄清组件-事件-委托三者的关系,本人用实际的例子来谈 谈小弟的理解。

  首先创建一个windows控件项目,添加如下控件样板。

  当事件触发时,会传递一个eventargs类型的参数给事件处理方法,为了能传递自定义的信息,我们可以创建一个继承于eventargs的事件参数 类,其定义如下:

public class eventloginargs:system.eventargs

{

public string struserid;

public string strusername;

public string struserpwd;

public bool bvaild;

public eventloginargs(string userid,string username,string userpwd)

{

struserid = userid;

strusername = username;

struserpwd = userpwd;

}

  再声明两个委托,它们是对eventloginargs和eventargs对象中的信息的封装,如下:

public delegate void userlogineventhandler(object sender,eventloginargs e);

public delegate void canceleventhandler(object sender,eventargs e);

  在组件中为了能让用户自定义某事件的处理方法,所以组件必需提供事件接口.如果只是继承于单个已有的windows控件,可以重载已知的方 法进行添加自己的处理,也可以声明自定义的事件接口.而若组件中包含多个控件,应该根据实际需要声明事件接口,此处本人就两个按钮的 使用而声明两个自定义的事件接口,如下:

public event userlogineventhandler submitlogin;

public event canceleventhandler cancel;

protected virtual void onsubmitlogin(eventloginargs e)

{

if(this.submitlogin!=null)

{

submitlogin(this,e);

}

}

protected virtual void oncancel(eventargs e)

{

if(this.cancel!=null)

{

cancel(this,e);

}

  其实submitlogin 是userlogineventhandler委托的实例,令人费解的是此事件的触发,传递,处理过程如何呢?

  在本例中是通过确定按钮来触发submitlogin事件的:

private void btnok_click(object sender, system.eventargs e)

{

if(txtid.text != ""&&txtname.text !=""&&txtpwd.text !="")

{

intlogintime++;

onsubmitlogin(new eventloginargs(txtid.text,txtname.text,txtpwd.text));

blogin = testuserindb(new eventloginargs(txtid.text,txtname.text,txtpwd.text));

messagebox.show("this is the btnok_click function!","in control",messageboxbuttons.ok);

if(!blogin)

messagebox.show("login in failed!","login error",messageboxbuttons.ok);

}

else

{

messagebox.show("your must input all the items!","login info",messageboxbuttons.ok);

}

}

  注意本例中的对话框是为了帮助了解事件的过程,真正有用的是第二个例子。

  在btnok_click事件响应中,先对进行简单的有效性检查,建议实际工作应作加强完善.intlogintime变量是尝试登录的次数.testuserindb是 通过已知信息在数据库中搜索出有关记录进行判断用户是否合法. 因为组件的测试是通过客户程序的,所以应该创建一个最简单明了的客户 程序.这是一个windows应用程序,将编译好的组件添加到用户控件栏中,拖出到工作区中,添加submitlogin事件的响应程序,如下:

private void usercontrol1_submitlogin(object sender, userlogin.eventloginargs e)

{

messagebox.show("this is in test form!"+ usercontrol1.blogin +"\ns login times is

"+usercontrol1.intlogintime +"\nes struserid="+e.struserid,"test",messageboxbuttons.ok);

}

  此时运行客户程序可得以下结果:

this is in test form!

this is the process in db

this is the btnok_click function!

  结果表明单击btnok按钮时执行组件中的onsubmitlogin(new eventloginargs(txtid.text,txtname.text,txtpwd.text)),此方法又调用 submitlogin(this,e),从而激发submitlogin事件,usercontrol1_submitlogin就进行响应,故打印第一行。

  跟着是执行testuserindb,它打印出第二行。

  最后是返回到btnok_click中输出最后一行。

  注意若btnok_click中的onsubmitlogin和testuserindb所在的行调换位置,其结果是不同的.第二个例子中,二者的位置调换,先进行数据库 查询判断,再在submitlogin的事件响应usercontrol1_submitlogin中处理结果,下面的是例子二的主要代码:

public delegate void userlogineventhandler(object sender,eventloginargs e);

public delegate void canceleventhandler(object sender,eventargs e);

public event userlogineventhandler submitlogin;

public event canceleventhandler cancel;

protected virtual void onsubmitlogin(eventloginargs e)

{

if(this.submitlogin!=null)

{

submitlogin(this,e);

}

}

protected virtual void oncancel(eventargs e)

{

if(this.cancel!=null)

cancel(this,e);

}

public string server

{

}

public string database

{

}

public string tableset

{

}

public string userfordb

{

}

public string pwdfordb

{

}

public bool testuserindb(eventloginargs e)

{

//messagebox.show("this is the process for db!","testuserindb",messageboxbuttons.ok);

bool bok = false;

if(this.strdatabase!=null && this.strserver!=null && this.struserfordb!=null)

{

if(this.strpwdfordb==null)

this.strpwdfordb = "";

string strconnection = "server="+this.strserver +";database="+this.strdatabase

+";uid="+this.struserfordb +";pwd="+this.strpwdfordb;

string strsql = "select userid,username,userpwd from "+this.strtableset+" where

userid="+e.struserid+" and username="+e.strusername +" and userpwd="+e.struserpwd+"";

sqlconnection conn = new sqlconnection(strconnection);

try

{

conn.open();

}

catch(sqlexception ex)

{

messagebox.show("数据库不能打开!请检查有关参数.","error",messageboxbuttons.ok);

return false;

}

sqldataadapter da = new sqldataadapter(strsql,conn);

dataset ds = new dataset();

try

{

da.fill(ds,this.strtableset);

}

catch(sqlexception ex)

{

……

}

foreach(datarow row in ds.tables[this.strtableset].rows)

{

if(row != null)

{

bok = true;

}

}

…….

}

else

{

bok = false;

}

return bok;

}

private void btnok_click(object sender, system.eventargs e)

{

if(txtid.text != ""&&txtname.text !=""&&txtpwd.text !="")

{

intlogintime++;

blogin = testuserindb(new eventloginargs(txtid.text,txtname.text,txtpwd.text));

if(!blogin)

messagebox.show("login in failed!","login error",messageboxbuttons.ok);

else

onsubmitlogin(new eventloginargs(txtid.text,txtname.text,txtpwd.text));

}

else

{

messagebox.show("your must input all the items!","login info",messageboxbuttons.ok);

}

}

private void btncancel_click(object sender, system.eventargs e)

{

oncancel(e);

}

private void usercontrol_load(object sender, system.eventargs e)

{

intlogintime = 0;

}

}

public class eventloginargs:system.eventargs

{

public string struserid;

public string strusername;

public string struserpwd;

public bool bvaild;

public eventloginargs(string userid,string username,string userpwd)

{

struserid = userid;

strusername = username;

struserpwd = userpwd;

}

}

  它的客户程序主要如下:

private void usercontrol1_submitlogin(object sender, userlogin.eventloginargs e)

{

 messagebox.show("this result is blogin="+ usercontrol1.blogin +" at "+usercontrol1.intlogintime +" times \n

  userid="+e.struserid+"\n username="+e.strusername,"testresult",messageboxbuttons.ok);

}

private void form1_load(object sender, system.eventargs e)

{

 usercontrol1.server = "localhost";

 usercontrol1.database="weiwen";

 usercontrol1.tableset = "testuser";

 usercontrol1.userfordb="sa";

 usercontrol1.pwdfordb = "sa";

}

  这两个例子的完整代码可以点击这里下载.

  读者可以参考学习,也可直接使用此组件,但使用时应当以microsoft sql server 作为后台数据库,所用到的用户表格应有 userid,username,userpwd三列,同时在客户程序中应对有关参数初始化,submitlogin事件返回值是尝试次数intlogintime和验证是否成功blogin,可参考扩展例子二。

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 深入理解C#编程中的组件-事件-委托-.NET教程,C#语言
分享到: 更多 (0)

相关推荐

  • 暂无文章