亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

通過實例具體講述事件委托

系統 1589 0
在組件編程中對事件的理解是十分重要的,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 +"/ne's 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,可參考擴展例子二。

通過實例具體講述事件委托


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 四虎影院地址 | 国内自拍网红在线综合 | 国产精品日韩欧美一区二区三区 | 黄页免费观看1 | 国产伦精品一区二区三区免费观看 | 羞羞免费网站 | 精品中文字幕一区在线 | 欧美日韩在线播一区二区三区 | 国产精品久久久久久久小唯西川 | 日韩成a人片在线观看日本 日韩成人 | 一级a爱片久久毛片 | 国产不卡在线看 | 日本毛片网 | 国产欧美日韩一区二区三区 | 午夜一级影院 | 国产精品2020观看久久 | 天天擦天天干 | 中日韩欧美中文字幕毛片 | 91不卡在线精品国产 | 久久欧洲视频 | 99er久久| 久久99视频精品 | 日本高清在线精品一区二区三区 | 久久网免费视频 | 曰本一级毛片免费播放 | 国产成人一区二区三区影院免费 | 韩国亚洲伊人久久综合影院 | 精品毛片 | 天天干夜夜想 | 久久精品中文字幕免费 | 国产成人在线播放视频 | 日本阿v精品视频在线观看 日本爱爱免费视频 | 精品久久久久久亚洲 | 亚洲欧美在线观看一区二区 | 国产69精品久久久久999三级 | 三级天堂| 91青草久久久久久清纯 | 欧美在线视频一区二区 | 青青热久久国产久精品秒播 | 亚洲欧美一区二区三区久久 | 中国第一毛片 |