1. 程式人生 > >C# 委託delegate與事件Event的用法和相關知識

C# 委託delegate與事件Event的用法和相關知識

什麼是事件?事件有哪些?怎麼用事件?

一、什麼是事件?

事件(Event) 基本上說是一個使用者操作,如按鍵、點選、滑鼠移動、輸入值改變等等,或者是一些出現,如系統生成的通知。應用程式需要在事件發生時響應事件。

比較常用的有:窗體載入事件,滑鼠事件,鍵盤事件,值改變事件,每個事件都有相應的操作響應。

二、事件有哪些?

在C#的名稱空間System下,有個EventArgs類,它包含事件資料的類的基類,並提供用於不包含事件資料的事件的值。下面簡單總結下常用的事件:

1.窗體載入事件

當我們寫Windows窗體應用程式時,經常用到窗體載入事件。雙擊窗體(舉例Form1)上方可以拖動拖動的位置,就會自動在Form1.Designer.cs檔案的Form1部分,新增一句

this.Load +=new System.EventHandler(this.Form1_Load); //語句1,

並且在Form1.cs檔案裡,寫好了方法返回值型別,名稱,引數等,留下方法體,供我們寫具體實現。

        private voidForm1_Load(object sender, EventArgs e)       //要執行的方法
        {
                 //方法體
        }

語句1中,this指的就是當前窗體,.Load就是該窗體的載入事件,EventHandler是一個系統定義好的委託,事件都是通過委託實現的;this.Form1_Load

是事件觸發後要執行的方法名稱。這行程式碼的意思就是:當窗體載入(彈出)時,執行Form1_Load方法。

使用VS開發工具,選中窗體或窗體的一個控制元件,在“屬性”中,點選事件按鈕(一個閃電符號),可以看到該元件擁有的事件,可以在時間後面手動新增繫結事件。

2.     滑鼠事件

·MouseClick  在滑鼠單擊控制元件時發生

·MouseDoubleClick   在滑鼠雙擊控制元件時發生。//按鈕沒有滑鼠雙擊事件

·MouseDown   當滑鼠指標在控制元件上方並按下時發生。//只要按下即觸發,與單擊不同,單擊需要鬆開

·MouseUp   當滑鼠指標在控制元件上方並釋放時發生。

·MouseEnter  

在滑鼠進入控制元件的可見部分時發生。//例如:滑鼠進入按鈕範圍,改變按鈕的顏色,給出按鈕功能提示等

·MouseLeave  在滑鼠離開控制元件的可見部分時發生

·MouseMove   滑鼠指標移過元件時發生   //有進有出

·MouseHover  當滑鼠在控制元件內保持靜止狀態達到一段時間時發生。//Mouse Hang Over,hang-懸停

·MouseCaptureChanged   在滑鼠捕獲更改後發生//常用於卡牌遊戲,選中牌,或鬆開選中的牌

3.     鍵盤事件

·KeyDown   在首次按下某個鍵時發生

·KeyPress   在控制元件具有焦點並且按下並釋放某個鍵時發生   //當前焦點必須在該控制元件上

·KeyUp   在釋放鍵時發生

雖然從字面理解, KeyDown是按下一個鍵的意思, 但實際上二者的根本區別是, 系統由KeyDown返回鍵盤的程式碼, 然後由TranslateMessage函式翻譯成成字元, 由KeyPress返回字元值. 因此在KeyDown中返回的是鍵盤的程式碼, 而KeyPress返回的是ASCII字元. 所以根據你的目的, 如果只想讀取字元, 用KeyPress, 如果想讀各鍵的狀態, 用KeyDown. 
說KeyDown是按下, KeyPress是按下並鬆開, 是不對的. 如果你一直按著鍵呢? 這時不斷地產生KeyDown和KeyPress

說明:如果想對整個Form做鍵盤事件(如:KeyPress),則選定整個Form並在事件的KeyPress繫結方法;如果想對某個元件做KeyPress,則選定該元件,再繫結方法即可,就是說你想讓事件在哪個焦點上起作用,就寫在哪個元件的事件裡。

4.     其他事件

還有一些事件,比如TextBox的TextChanged事件,size改變事件,datagridview的雙擊、新增、刪除事件,各種背景改變事件等等,VS開發工具上都有列舉

三、怎麼用事件
事件是通過委託delegate實現的,委託是一個類,它定義了方法的型別,使得可以將方法當作另一個方法的引數來進行傳遞,這種將方法動態地賦給引數的做法,可以避免在程式中大量使用If-Else(Switch)語句,同時使得程式具有更好的可擴充套件性。說得簡單點,委託是用來執行某個方法的,這個方法與委託有相同的返回值型別和引數。

public delegate void eventHandler(string str);   //宣告一個委託eventHandler,無返回值,有一個string引數。所以,該代理要執行的方法也必須是void型別,有一個string引數。

public  event  eventHandler  eatEvent;    //基於上面的委託定義事件eatEvent

下面舉個例子,在控制檯輸入數字,當數字不等時,觸發兩個事件。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace eventLearn20160909
{
    public class EventTest
    {
        private int value;

        public delegate void NumManipulationHandler();  //定義委託NumManipulationHandler

        public event NumManipulationHandler ChangeNum;  //根據委託定義事件ChangeNum

        protected virtual void OnNumChanged()
        {
            if (ChangeNum != null)
            {
                ChangeNum();
            }
            else
            {
                Console.WriteLine("事件觸發(1)!");
            }

        }
        protected virtual void OnNumChanged2()
        {
            if (ChangeNum != null)
            {
                ChangeNum();
            }
            else
            {
                Console.WriteLine("事件觸發(2)!");
            }

        }
        public EventTest(int n)  //設值
        {
            SetValue(n);
        }
        public void SetValue(int n)   //觸發執行
        {
            if (value != n)
            {
                value = n;
                OnNumChanged();
                OnNumChanged2();
            }
        }

        class Program
        {
            static void Main(string[] args)
            {
                EventTest e = new EventTest(0);
                Console.WriteLine("請輸入數字:");
                while (true)
                {
                    int i = int.Parse(Console.ReadLine());   //讀取數字並設值
                    e.SetValue(i);
                    Console.WriteLine("\n請輸入數字:");
                }
            }
        }
    }
}

執行結果如下:

相關推薦

C# 委託delegate事件Event用法相關知識

什麼是事件?事件有哪些?怎麼用事件? 一、什麼是事件? 事件(Event) 基本上說是一個使用者操作,如按鍵、點選、滑鼠移動、輸入值改變等等,或者是一些出現,如系統生成的通知。應用程式需要在事件發生時響應事件。 比較常用的有:窗體載入事件,滑鼠事件,鍵盤事件,值改變事件,每

C# 委託(delegate)事件(event)詳解

C# 中的委託和事件 引言 委託 和 事件在 .Net Framework中的應用非常廣泛,然而,較好地理解委託和事件對很多接觸C#時間不長的人來說並不容易。它們就像是一道檻兒,過了這個檻的人,覺得真是太容易了,而沒有過去的人每次見到委託和事件就覺得心裡別(biè)得慌,混身不自在。本文中,我將通過兩個範例

C#委託(delegate、Action、Func、predicate)事件

一、前言 剛開始工作的時候,覺得委託和事件有些神祕,而當你理解他們之後,也覺得好像沒有想象中的那麼難。在專案中運用委託和事件,你會發現他非常棒,這篇博文算是自己對委託和事件的一次梳理和總結。 二、委託 C#中的委託,相當於C++中的指標函式,但委託是面向物件的,是安全的,是一個特殊的類,當然他也是引用型

總結oninput、onchangeonpropertychange事件用法區別

前端頁面開發的很多情況下都需要實時監聽文字框輸入,比如騰訊微博編寫140字的微博時輸入框hu9i動態顯示還可以輸入的字數。過去一般都使用onchange/onkeyup/onkeypress/onkeydown實現,但是這存在著一些不好的使用者體驗。比如onchange事件只在鍵盤或者滑鼠操作

oninput、onchangeonpropertychange事件用法區別

概述 前端頁面開發的很多情況下都需要實時監聽文字框輸入,比如騰訊微博編寫140字的微博時輸入框hu9i動態顯示還可以輸入的字數。過去一般都使用onchange/onkeyup/onkeypress/onkeydown實現,但是這存在著一些不好的使

C# 委託(delegate)、泛型委託Lambda表示式

目錄 # 什麼是委託 # 委託宣告、例項化和呼叫 1、宣告 2、委託的例項化 3、委託例項的呼叫 4、委託完整的簡單示例 #泛型委託

C#委托事件學習筆記

調用函數 msdn http msd proc for reac .net 委托方 今天跟隨視頻學習了一下C#中最重要的一些概念之委托與事件。老楊的視頻講的還是挺深入淺出,不過剛接觸C#.NET的人還是朦朦朧朧,就像張子陽先生說的“每次見到委托和事件就覺得心裏別

C# 委托事件

觀察 自動完成 代碼 委托 約定 .html 完成 blog htm c#事件 委托: 1.類似觀察者模式。 2.當某個對象(類),執行某個動作時,之前委托的事情會自動完成。 (如B,C訂閱A的事件,當A執行某動作,B和C均會按照約定進行對應動作)使用步驟

c# 委托事件的區別

變量 del 另一個 ext 類型 編譯 擴展 hand 例子 委托與事件的區別 委托和事件沒有可比性,因為委托是數據類型,事件是對象(可以理解為對委托變量的封裝。),下面說的是委托的對象(用委托方式實現的事件)和(標準的event方式實現)事件的區別。事件的內部是用委托

[js高手之路]深入淺出webpack系列1-安裝基本打包用法命令參數

查看 2-2 gre colors 令行 一起 切換 json round webpack,我想大家應該都知道或者聽過,Webpack是前端一個工具,可以讓各個模塊進行加載,預處理,再進行打包。現代的前端開發很多環境都依賴webpack構建,比如vue官方就推薦使用webp

從拳皇97中淺談C#委托事件

n) virtual 所有 [] 輸出 rri strac 理解 簡單 先看看下列代碼: protected void Page_Load(object sender, EventArgs e){ } protected void btnSearch_Click(objec

vue.js 中 :is is 的用法區別,學習全域性區域性註冊元件

  vue中 is用來動態切換元件,詳細請看示例:(順便講解父向子元件的傳遞資訊) html: <div id="app">   <!--         1.在這裡呼叫元件。   &

C++中引用(&)的用法應用例項

對於習慣使用C進行開發的朋友們,在看到c++中出現的&符號,可能會犯迷糊,因為在C語言中這個符號表示了取地址符,但是在C++中它卻有著不同的用途,掌握C++的&符號,是提高程式碼執行效率和增強程式碼質量的一個很好的辦法。在 c++學習提高篇(3)---隱式

is:is的用法區別(Vue)

首先說一下is的用法 有些元素內部不能使用自定義標籤或者自定義標籤內也不能放某些特殊的標籤,這時候就要用is代替一下,讓HTML語法符合規則驗證。是屬於指定要在內部使用的標籤。 在自定義元件中使用這些受限制的元素時會導致一些問題,例如: <ul>裡面不能直

Effective C++:類函式的設計申明

在看《Effective C++》這本書的過程中,我無數次的發出感嘆,寫得太好了,句句一針見血,直接說到點上。下面的索引對應的是書中的章節。 18:努力讓介面完美且最小化 為了客戶端的方便呼叫,介面中可能會定義很多方法,而其中可能右很多方法是多餘或是重複的,這樣會導致介面中方法太多,讓

C++Primer--->#include#include以及#inclue #include的區別

2.為什麼下面這段程式碼 #include <string.h> void main() {      string aaa= "abcsd d";      printf("looking for abc from abcdecd %s\n",          (strcmp(aaa

C++中陣列STL中vectorarray的比較

我的Github個人部落格 ----------------------------------- 阮一峰的網路日誌 ----------------------------------- 劉未鵬 | Mind Hacks ---------------------------

c# Windows窗體事件驅動

建立Windows應用程式基本步驟 開啟Visual Studio軟體 新建專案 專案型別:Visual C#專案 模板:Windows 應用程式 熟悉開發環境 窗體的常用屬性 窗體的屬性非常多, 以下是常用的幾個。 Nam

C#委託/Lambda表示式/事件

1.委託基本定義 委託用delegate定義,指定返回值和引數列表的函式型別,不包括資料,這些方法是不區分靜態或者非靜態的,可以引用一個委託例項也可以引用多個(廣播)。 可以任意修飾符,可以防止在類內部,也可以在類外部,不可以在函式內部定義。 給委託物件賦值時候需要對委託建

C++學習筆記(四)C++中友元friend的用法應用例項

C++中的友元機制允許類的非公有成員被一個類或者函式訪問,友元按型別分為三種: (1)普通非類成員函式作為友元 (2)類的成員函式作為友元 (3)類作為友元。 友元包括友元的宣告以及友元的定義。友元