2012-11-19 15 views
11

मुझे किसी ईवेंट के साथ डेटा पास करने की आवश्यकता है। वर्तमान में, अधिक डेटा प्राप्त करने पर (कॉमपोर्ट के माध्यम से), ईवेंट आग लगेगा लेकिन पिछली घटना (& डेटा) अभी तक संभाली नहीं जा रही है, इसलिए डेटा ओवरराइट हो जाता है।
मैं & डेटा को सुरक्षित तरीके से कैसे संभाल सकता हूं? मेरे पास इस तरह की कई घटनाएं हैं (15x), इसलिए मुझे यकीन नहीं है कि डेटा के लिए कतार का उपयोग करना ईवेंट के साथ सबसे अच्छा तरीका है या डेटा पास करना है (जैसे एसओ आइटम 4215845)।घटनाओं के साथ डेटा पास करना

उदाहरण (इस उदाहरण एक तार के साथ है, लेकिन मैं भी सरणियों, bools आदि का उपयोग करें): 'इस' की ओर (Class1) पर

:

public event EventHandler evDiaStringMessage = delegate { }; 
private void evDiaStringMessageEvent() 
{ 
    evDiaStringMessage(this, new EventArgs()); 
} 
private static string _DiaString; 
public string DiaString 
{ 
    get { return _DiaString; } 
    set { _DiaString = value; } 
} 

DiaString डेटा होता है और हो जाता है evDiaStringMessage को जल्द ही निकाल दिया जाता है जब ओवरराइट किया जाता है।

dia.evDiaStringMessage += new EventHandler(dia_evDiaStringMessage); 

private delegate void dia_evDiaStringMessageCallBack(object sender, EventArgs e); 
void dia_evDiaStringMessage(object sender, EventArgs e) 
{ 
    if (this.InvokeRequired) 
    { 
     this.BeginInvoke(new dia_evDiaStringMessageCallBack(dia_evDiaStringMessage), new object[] { sender, e}); 
    } 
    else 
    { 
     frmcomm.CommTextBox("Receiver message: " + dia.DiaString + "\r\n", Color.Red); 
    } 
} 

dia.DiaString उम्मीद डेटा (पिछले डेटा) शामिल नहीं है, लेकिन सभी घटनाओं 'प्राप्त' कर रहे हैं:

'रिसीवर/जीयूआई' की ओर (class2) पर

आपकी मदद बहुत सराहना की है! एक उदाहरण के साथ और भी अधिक!

संपादित करें:

मैं करने के लिए कोड बदल दिया है: (Class1) 'इस' पक्ष में

:

public event EventHandler<DiaStringEventArgs> evDiaStringMessage ; 
public class DiaStringEventArgs : EventArgs 
{ 
    public string DiaString { get; set; } 
} 

private void evDiaStringMessageEvent(DiaStringEventArgs e) 
{ 
    EventHandler<DiaStringEventArgs> handler = evDiaStringMessage; 
    if (handler != null) 
     handler(this, e); 
} 

...

private void PrepareDataAndFireEvent() 
{ 
    DiaStringEventArgs args = new DiaStringEventArgs(); 
    args.DiaString = ByteToString(data); 
    evDiaStringMessageEvent(args); 
} 

पर 'रिसीवर/जीयूआई' पक्ष (कक्षा 2):

dia.evDiaStringMessage += new EventHandler<ifDiA10.DiaStringEventArgs>(dia_evDiaStringMessage); 

private delegate void dia_evDiaStringMessageCallBack(object sender, ifDiA10.DiaStringEventArgs e); 
void dia_evDiaStringMessage(object sender, ifDiA10.DiaStringEventArgs e) 
{ 
    if (this.InvokeRequired) 
    { 
     this.BeginInvoke(new dia_evDiaStringMessageCallBack(dia_evDiaStringMessage), new object[] { sender, e}); 
    } 
    else 
    { 
     frmcomm.CommTextBox("Receiver message: " + e.DiaString + "\r\n", Color.Red); 
    } 
} 
+0

सबसे पहले, मैं 'EventHandler' को' EventHandler '] (http://msdn.microsoft.com/en-us/library/db0etb8x.aspx) द्वारा तर्कों को पारित करने की संभावना देने के लिए प्रतिस्थापित करूंगा घटना हैंडलर। –

उत्तर

14

आप एक कस्टम EventArgs वर्ग में अपने डेटा स्टोर कर सकते हैं:

public class ReceivedDataEventArgs : EventArgs 
{ 
    // Add the properties you require 
} 

घटना इतनी तरह परिभाषित किया गया है:

public event EventHandler<ReceivedDataEventArgs> ReceivedData; 

आपका हैंडलर EventArgs वस्तु के बजाय अपने वर्ग एक उदाहरण में ले जाएगा , और इसलिए आपके पास सही डेटा होगा।

+0

धन्यवाद जॉन बी और स्टीव बी, यह अच्छा काम करता है! – Ruudster

+0

[घटनाओं के संबंध में माइक्रोसॉफ्ट दस्तावेज से लिंक] (https://docs.microsoft.com/en-us/dotnet/standard/events/#event-data) – Alexander

2

ईवेंट को संभालने के दौरान ईवेंट को वापस पढ़ने के बजाय आपको dia.DiaString का मान पास करना चाहिए।

आप EventArgs कक्षा को विस्तारित करके और कस्टम गुणों को बनाकर ऐसा कर सकते हैं।

यदि आपको एक उदाहरण की आवश्यकता है तो मुझे बताएं।

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