2010-10-22 11 views
7

किसी ने मुझे यह कोड दिया जो महान काम करता है। लेकिन मैं वास्तव में समझना चाहूंगा कि इसके अंदर क्या हो रहा है। क्या कोई कृपया समझा सकता है? कोड के प्रत्येक भाग का अर्थ क्या है? कोड एक कस्टम नियंत्रण के अंदर है जिसमें पैनल के अंदर दो लेबल हैं।उपयोगकर्ता नियंत्रण में कस्टम इवेंट के लिए कोड समझाएं

इसके अलावा मैंने कुछ कस्टम नियंत्रण घटनाएं देखी हैं जो वाक्यविन्यास जोड़ने/निकालने का उपयोग करती हैं, इसके लिए क्या है? यहां क्या हो रहा है के साथ क्या अंतर है?

public partial class UserControl1 : UserControl 
{ 
    public UserControl1() 
    { 
     InitializeComponent(); 
    } 

    public event EventHandler MyCustomClickEvent; 

    protected virtual void OnMyCustomClickEvent(EventArgs e) 
    { 
     // Here, you use the "this" so it's your own control. You can also 
     // customize the EventArgs to pass something you'd like. 

     if (MyCustomClickEvent != null) 
      MyCustomClickEvent(this, e); 
    } 

    private void label1_Click(object sender, EventArgs e) 
    { 
     OnMyCustomClickEvent(EventArgs.Empty); 
    } 
} 

उत्तर

8

नीचे दी गई मेरी टिप्पणियां देखें। इस अवधारणा पर एक और अधिक विस्तृत घटना I blogged के लिए कुछ समय पहले जहां मैं पूरी प्रक्रिया पर अधिक जानकारी देता हूं।

public partial class UserControl1 : UserControl 
{ 
    //This is the standard constructor of a user control 
    public UserControl1() 
    { 
     InitializeComponent(); 
    } 

    //This defines an event called "MyCustomClickEvent", which is a generic 
    //event handler. (EventHander is a delegate definition that defines the contract 
    //of what information will be shared by the event. In this case a single parameter 
    //of an EventArgs object. 
    public event EventHandler MyCustomClickEvent; 


    //This method is used to raise the event, when the event should be raised, 
    //this method will check to see if there are any subscribers, if there are, 
    //it raises the event 
    protected virtual void OnMyCustomClickEvent(EventArgs e) 
    { 
     // Here, you use the "this" so it's your own control. You can also 
     // customize the EventArgs to pass something you'd like. 

     if (MyCustomClickEvent != null) 
      MyCustomClickEvent(this, e); 
    } 

    private void label1_Click(object sender, EventArgs e) 
    { 
     OnMyCustomClickEvent(EventArgs.Empty); 
    } 
} 
2

मैं Events for C# on MSDN पर पढ़ने की सलाह देते हैं। यह विस्तार से कवर किया गया है।

असल में, MyCustomClickEvent एक घटना है। घटना को बढ़ाने के लिए OnMyCustomClickEvent विधि का उपयोग किया जाता है, लेकिन ऐसा किया जा रहा है कि उप-वर्ग भी आवश्यक होने पर इस ईवेंट को बढ़ा सकते हैं।

जब आप "लेबल 1" पर क्लिक करते हैं, तो OnMyCustomClickEvent विधि चलता है, जो ईवेंट को बढ़ाता है। घटना के लिए सदस्यता लेने वाले किसी भी प्रतिनिधि उस बिंदु पर निष्पादित होंगे।

0

ऐड/निकालने के बारे में, यह घटनाओं का "मैन्युअल" कार्यान्वयन है। निम्नलिखित दो स्निपेट एक ही काम करते हैं।

स्वचालित कार्यान्वयन:

public event EventHandler MyEvent; 

मैनुअल कार्यान्वयन:

private EventHandler _myEvent; 

public event EventHandler MyEvent 
{ 
    add { _myEvent += value; } 
    remove { _myEvent -= value; } 
} 

यह बिल्कुल वैसा ही नहीं माना जाता क्योंकि स्वत: गुण जहां:

:

public string Property { get; set; }; 

बिल्कुल के रूप में एक ही है

private string _property; 

public string Property 
{ 
    get { return _property; } 
    set { _property = value; } 
} 

इन स्निपेट के बीच का अंतर यह है कि मैन्युअल कार्यान्वयन के साथ, आपको अधिक नियंत्रण मिलता है। उदाहरण हैं:

  • ऐड में तर्क लागू/हो और/सेट निकाल;
  • उन फ़ील्ड तक पहुंच प्राप्त करें जो आपको सेट करने की अनुमति देती हैं उदा। [NonSerializable];
  • मानों को उदा। एक Dictionary

Form कक्षा उदा। उत्तरार्द्ध फॉर्म वर्ग में फ़ील्ड की संख्या को रखने के लिए करता है।

+0

धन्यवाद पीटर! यह वास्तव में वह कोड है जो आपने मुझे दिया है, बस बेहतर समझने की कोशिश कर रहे हैं – VerizonW

+0

विधि वर्चुअल संरक्षित क्यों है? – VerizonW

+0

वैसे, यह काफी हद तक सम्मेलन के कारण है, जैसा कि विधि के पैरामीटर परिभाषित किए गए हैं। आप (लगभग) हमेशा इन तरीकों को संरक्षित वर्चुअल के रूप में परिभाषित करते हैं क्योंकि यह विरासत वर्ग को ईवेंट को पंजीकृत करने के बजाय विधि को ओवरराइड करने का विकल्प देता है। एक बाल वर्ग बनाते समय, इसे कन्स्ट्रक्टर में ईवेंट जोड़ने की बजाय विधि को ओवरराइड करना पसंद किया जाता है। –

1

आपने कुछ कस्टम नियंत्रण उदाहरणों में ईवेंट के लिए जोड़ने/निकालने वाक्यविन्यास को देखने का उल्लेख किया है। सबसे अधिक संभावना उन उदाहरण इस तरह के निम्न उदाहरण में, ईवेंट हैंडलर्स स्टोर करने के लिए using the UserControl class' Events property हैं:

public event EventHandler MyEvent 
    { 
     add 
     { 
      Events.AddHandler("MyEvent", value); 
     } 
     remove 
     { 
      Events.RemoveHandler("MyEvent", value); 
     } 
    } 

विचार है कि वहाँ आम तौर पर एक नियंत्रण के एक उपभोक्ता हर एक घटना को संभालने के लिए चाहते हैं के लिए नहीं जा रहा है कि नियंत्रण उजागर ।यदि प्रत्येक कार्यक्रम को "फ़ील्ड" ईवेंट (जैसा कि आपके उदाहरण में) के रूप में परिभाषित किया गया है, तो प्रत्येक ईवेंट उस घटना के लिए कोई ग्राहक नहीं होने पर भी स्मृति का एक हिस्सा लेगा। जब आपके पास सैकड़ों नियंत्रणों का एक जटिल पृष्ठ बनाया गया है, जिनमें से प्रत्येक में दर्जनों घटनाएं हो सकती हैं, अप्रयुक्त घटनाओं के लिए स्मृति खपत महत्वहीन नहीं है।

यही कारण है कि System.ComponentModel.Component कक्षा (System.Windows.Forms.Control कक्षा की मूल श्रेणी) में Events संपत्ति है, जो मूल रूप से ईवेंट हैंडलर प्रतिनिधियों को स्टोर करने के लिए एक शब्दकोश है। इस तरह प्रत्येक कार्यक्रम को एक क्षेत्र की तुलना में संपत्ति की तरह लागू किया जाता है। प्रत्येक ईवेंट स्टोर के लिए हैंडलर जोड़ें/हटाएं या Events शब्दकोश से प्रतिनिधियों को हटा दें। यदि किसी ईवेंट का उपयोग नहीं किया जाता है, तो इसके लिए Events शब्दकोश में कोई प्रविष्टि नहीं है, और उस ईवेंट के लिए कोई अतिरिक्त मेमोरी नहीं ली जाती है। यह थोड़ी अधिक मेमोरी बचाने के लिए थोड़ा अधिक काम करने (ईवेंट हैंडलर को देखने के लिए) करने का एक व्यापार-बंद है।

संपादित करें: एएसपी.नेट की बजाय विंडोज फॉर्म से संबंधित मेरा उत्तर तय करें, हालांकि अवधारणाएं समान हैं।

संबंधित मुद्दे