1. 程式人生 > >通過c# 實現自定義屬性改變觸發自定義事件 ,理解自定義事件及其觸發過程

通過c# 實現自定義屬性改變觸發自定義事件 ,理解自定義事件及其觸發過程

以下說明可解釋自定義的事件的自定義觸發過程:

直接上程式碼,內含說明(介面是兩個文字框textbox1,textbox2,和一個button1,介面的Load事件,button的click事件)

Form1 類(呼叫者端)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace Test {     public partial class Form1 : Form     {         public Form1()         {             InitializeComponent();         }         //CustomClass cc = new CustomClass(1, "Lee");//測試屬性值不變化的情況         CustomClass cc = new CustomClass();//空建構函式,一邊測試屬性值改變         private void Form1_Load(object sender, EventArgs e)         { cc.Changed += new CustomClass.ChangedEventHandler(cc_Changed);//呼叫者端訂閱事件,為Changed事件提供了具體的事件函式cc_Changed
        }         private void button1_Click(object sender, EventArgs e)         { cc.Cid = 1;             cc.Cname = "Lee";//給CustomClass的屬性賦值,賦值是引發事件             string str = cc.Cid.ToString() + cc.Cname;             MessageBox.Show(str);         }         private void cc_Changed()//事件  注:被自定義事件繫結的事件函式
        {             textBox1.Text = cc.Cid.ToString();             textBox2.Text = cc.Cname;         }     }  CustomClass類(事件定義端)
    public class CustomClass     {         public delegate void ChangedEventHandler();//定義委託         public event ChangedEventHandler Changed;//定義事件         private int _Cid;         private string _Cname;         public CustomClass()         {         }         public CustomClass(int cCid, string cCname)         {             this._Cid = cCid;             this._Cname = cCname;         }         protected virtual void OnChanged()         {             if (Changed!=null)             {                 Changed();             }         }         public int Cid         {             get             {                 return _Cid;             }             set             {                 if (_Cid!=value)//這裡是文字改變時的處理                 {                     _Cid = value; OnChanged();//啟動事件
                    //注:變相的在更改值的過程中,呼叫了上面繫結的事件函式“cc_Changed()”,做到了對自定義事件的觸發(cc_Changed()幻術的執行)                              //需要明白:在當前類CustomClass中,不能直接知道要執行的事件函式                     //或者這麼說:在定義自定義事件的類中,僅僅定義(1)事件本身及(2)可能在類中觸發的事件呼叫(以本類而言,就是執行OnChanged()中的Changed()),具體呼叫哪個事件函式,是由“呼叫者端”提供的                 }             }         }         public string Cname         {             get             {                 return _Cname;             }             set             {                 if (_Cname != value)                 {                     _Cname = value;                     OnChanged();                 }             }         }     } } 以下是網上的一段非常經典的屬性值改變引發自定義事件的例子,如下;     public class MyClass     {         public event EventHandler<PropertyChagedEventArgs> MyPropertyChanging;         public event EventHandler<PropertyChagedEventArgs> MyPropertyChanged;         private int _myProperty;         public int MyProperty         {             get { return _myProperty; }             set             {                 if (value != _myProperty)                 {                     PropertyChagedEventArgs e = new PropertyChagedEventArgs("MyProperty", _myProperty, value);//初始化                     if (this.MyPropertyChanging != null)                     {                         this.MyPropertyChanging(this, e);                         if (e.Cancel) return;                     }                     _myProperty = (int)e.NewValue;                     if (this.MyPropertyChanged != null)                     {                         this.MyPropertyChanged(this, e);                     }                 }             }         }     }     /// <summary>     /// 通用的類     /// </summary>     public class PropertyChagedEventArgs : EventArgs     {         public PropertyChagedEventArgs(string propertyName,object oldValue,object newValue)         {             PropertyName = propertyName;             OldValue = oldValue;             NewValue = newValue;         }         public bool Cancel { get; set; }         public string PropertyName { get; private set; }         public object OldValue { get; private set; }         public object NewValue { get; set; }     }

相關推薦

通過c# 實現定義屬性改變觸發定義事件 理解定義事件及其觸發過程

以下說明可解釋自定義的事件的自定義觸發過程: 直接上程式碼,內含說明(介面是兩個文字框textbox1,textbox2,和一個button1,介面的Load事件,button的click事件) Form1 類(呼叫者端) using System; using

PAT 我要通過 C++實現

題目內容: “答案正確”是自動判題系統給出的最令人歡喜的回覆。本題屬於 PAT 的“答案正確”大派送 —— 只要讀入的字串滿足下列條件,系統就輸出“答案正確”,否則輸出“答案錯誤”。 得到“答案正確”的條件是: 字串中必須僅有 P、 A、 T這三種字元,不可以包含其它字元;

Android JNI開發 通過C++實現眼瞼標註

C++程式碼: #include <jni.h> #include <string> #include <opencv2/opencv.hpp> #include <android/log.h> #include <iostrea

通過C++實現判斷點與多邊形的關係和兩點之間的距離

1.判斷兩點之間的距離 #include<math.h> //計算兩點之間的距離 double calculateDistence(double* p0,double* p){ double tempx = p[0] - p0[0];

C# 實現拖拉控制元件改變位置與大小

前言:   很多時候我們需要在執行時,動態地改變控制元件的位置以及大小,以獲得更好的佈局。比如說實際專案中的可自定義的報表、可自定義的單據等諸如此類。它們有個特點就是允許客戶或者二次開發人員設計它們需要的介面設定功能。   本人以前也做過可自定義系統,包括

自己實現的資料表格控制元件(dataTable)支援定義樣式和標題資料、ajax等各種定義設定以及分頁定義

一、前言 也沒什麼好說的嘛,用了蠻多github上開源的能夠實現dataTable功能的表格外掛,不過都預設繫結樣式啊,資料格式也設定的比較死,所以忍不住自己實現了一個簡單的可自定義樣式和自定義資料返回格式的資料表格外掛,原生js是保留的,後面如果更新新版本的話會去除對jq

Android 獲取不到定義屬性(Android studio 2.2版本中定義屬性的宣告)

跟著慕課網中鴻洋大神照著寫QQ5.0的側滑選單中遇到的問題。 如果按照鴻洋大神所說書寫格式是 xmlns:arrtss=”http://schemas.android.com/apk/+當前應用包名但

通過C#實現OPC-UA服務端(二)

前言 通過我前面的一篇檔案,我們已經能夠搭建一個OPC-UA服務端了,並且也擁有了一些基礎功能。這一次咱們就來了解一下OPC-UA的服務註冊與發現,如果對服務註冊與發現這個概念不理解的朋友,可以先百度一下,由於近年來微服務架構的興起,服務註冊與發現已經成為一個很時髦的概念,它的主要功能可分為三點:1、服務註冊

opencv3.3.1+vs2015+c++實現直接在圖像上畫掩碼保存掩碼圖片

gpo named write n) eve sta and bubuko all 左鍵紅右鍵藍,保存為k #include "opencv2\imgproc\imgproc.hpp" // Gaussian Blur #include "opencv2\core\c

C#實現.Net對郵件進行DKIM簽名和驗證支援附件傳送郵件簽名後直接投遞到對方伺服器(無需己方郵件伺服器)

專案地址 github.com/xiangyuecn/… 主要支援 對郵件進行DKIM簽名,支援帶附件 對整個郵件內容(.eml檔案)的DKIM簽名進行驗證 對MailMessage、SmtpClient進行了一次封裝,傳送郵件簡單易用,進行DKIM簽名後直接投遞到對方伺服器(無需己方郵件

c#實現用SQL池(多執行緒)定時批量執行SQL語句 (轉)

在實際專案開發中,業務邏輯層的處理速度往往很快,特別是在開發Socket通訊服務的時候,網路傳輸很快,但是一旦加上資料庫操作,效能一落千丈,資料庫操作的效率往往成為一個系統整體效能的瓶頸。面對這問題,我們怎麼辦呢?好,下面我就為大家介紹一種方法:構建SQL池,分離業務邏輯層

Android手機客戶端通過JSP實現與Tomcat伺服器端通訊(Msql資料庫Json作為載體)--服務端程式碼

伺服器端主要程式碼: 1.首先構建一個Person類,用來儲存使用者資訊 public class Person private String name; private String address; private Integer age; public P

SparkSQL建立RDD:UDF(UserDataFrame)使用者建立定義函式(包含動態建立schema使用者定義函式查詢字元的個數)【Java版純程式碼】

Java版程式碼:  package com.bjsxt; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.apache.spark.Spark

C# 實現Winform全屏後不遮擋工作列顯示工作列

最近在忙中抽閒,看我的桌面太過死了,不生動,不可愛=。=。。 然後默默的想寫一個動態桌面的一個小東西活潑一下。。。 隨後拿起來了N久不碰的C#(本人C#渣,不,應該說什麼都渣。。。) 結果在winform全屏化的時候,遮擋了下面的工作列;這樣的話體驗性就不

CSS實現適應高度佈局:頭部底部固定中間適應鋪滿螢幕剩餘高度中間盒子裡左盒子固定右盒子適應寬度

如題:頂部底部固定高度,中間部分鋪滿螢幕剩餘高度,中間盒子裡又左盒子固定寬度,右盒子自適應寬度且距左盒子總是20px 主要解決方法是中間盒子的top:40px;bottom:40px;設定。原理是在p

Asp.net 2.0定義控制元件(點選HyperLink後執行事件)[網友問題: DataList裡HyperLink控制元件激發事件在哪定義?]

 (一). 概述         HyperLink預設沒有Click事件,  重寫了一個HyperLink自定義控制元件.         實現原理:          預設Hyperlink是跳到點選請求的頁面, 本HyperLink自定義控制元件最終也是跳轉到請求的頁面, 但期間        執行

通過JSP實現:從網頁上上載一個文字檔案能顯示上傳成功。之後點一個按鈕能在網頁上顯示出該文字檔案的大小(位元組數)。

(1)在E:\apache-tomcat-8.0.52\webapps\ROOT目錄下建立dou.jsp和upload.jsp檔案: 兩個檔案的內容如下: dou.jsp <%@ page contentType="text/html; ch

easyui-window 關閉事件只要關閉視窗就會觸發

$(function () {             $('#windowsMSG').window({                 onBeforeClose: function () { //當面板關閉之前觸發的事件                     if

js監聽頁面的scroll事件當移到底部時觸發事件

//頁面拉到底時自動載入更多 $(window).scroll(function(event){ var wScrollY = window.scrollY; // 當前滾動條位置

js中常用的事件onclick 單擊事件、onblur 失去焦點事件、onchange改變事件、onmouseover滑鼠進入事件、onmouseout滑鼠移除事件、onsubmit提交事件

onclick 單擊事件 onblur 失去焦點事件 onchange 當物件或選中區的內容改變時觸發。 onmouseover 當用戶將滑鼠指標移動到物件內時觸發。 onmouseout 當用戶將滑鼠指標移出物件邊界時觸發。 onsubmit 當表單將要被提交時觸發。