2013-01-24 19 views
11

बनाएं मैंने डेटाबेस कनेक्शन के लिए UserControl बनाया है जहां कनेक्शन के लिए उपयोगकर्ता इनपुट उपयोगकर्ता नाम और पासवर्ड। यह UserControl एक MainWindow.xamlकस्टम wpf ईवेंट

में है, अब, मेरे UserControl के पीछे कोड में मैं एक MSSQL कनेक्शन बना देता हूं। अगर लॉगिन सफलतापूर्वक है, तो मैं मेनविंडो में बेनकाब करने के लिए एक कस्टम इवेंट उठाना चाहता हूं।

MyUserControl.xaml.cs

try 
{ 

    using (SqlConnection sqlConn = new SqlConnection(connection)) 
    { 
     sqlConn.Open(); 
     MessageBox.Show("Connessione Riuscita!", "Connessione a " + TextIP.Text, MessageBoxButton.OK, MessageBoxImage.Information); 
     RaiseMyEvent(); 
     sqlConn.Close();     
    } 
} 
catch (SqlException ex) 
{ 
    MessageBox.Show("Connessione Fallita: " + ex.Message, "Connessione a " + TextIP.Text, MessageBoxButton.OK, MessageBoxImage.Error); 
} 

और MainWindow.xaml में मैं mypersonalized घटना का उपयोग करना चाहते में उदाहरण के लिए:

<Window x:Class="XLogin.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525" 
     xmlns:local="clr-namespace:XLogin" WindowStartupLocation="CenterScreen"> 
    <Grid> 
     <local:DBLogin x:Name="DBLoginFrame" MyPersonalizedUCEvent="DBLoginFrame_MyPersonalizedUCEvent"/> 
    </Grid> 
</Window> 

मैं कई प्रकार कनेक्शन के लिए इस की जरूरत है (एमएसएसक्यूएल, ओरेकल, माईएसक्ल इत्यादि)।

यह कैसे प्राप्त करें?

उत्तर

18

सबसे पहले आपको एक प्रतिनिधि को परिभाषित करना चाहिए और उस घटना को परिभाषित करने के लिए उस प्रतिनिधि का उपयोग करना चाहिए।

अपने MyUserControl.xaml.cs में फाइल जोड़ने निम्नलिखित

विकल्प 1

public delegate void MyPersonalizedUCEventHandler(string sampleParam); 

    public event MyPersonalizedUCEventHandler MyPersonalizedUCEvent; 

    public void RaiseMyEvent() 
    { 
     // Your logic 
     if (MyPersonalizedUCEvent != null) 
     { 
      MyPersonalizedUCEvent("sample parameter"); 
     } 
    } 

और बस हो गया। आपने अपना कार्यक्रम परिभाषित किया है।

विकल्प Action प्रतिनिधि के बारे में 2

public event Action<String> MyPersonalizedUCEvent; 

    public void RaiseMyEvent() 
    { 
     // Your logic 
     if (MyPersonalizedUCEvent != null) 
     { 
      MyPersonalizedUCEvent("sample parameter"); 
     } 
    } 

अधिक इस link में पाया जा सकता।

नोट:

कई मामलों में अगर घटनाओं के लिए इस्तेमाल नहीं कर रहे हैं ठीक से वे पैदा कर सकता है मेमोरी लीक। बस सुनिश्चित करें कि आपने नीचे दिखाए गए पंजीकृत ईवेंट हैंडलर को हटाने के लिए कोड लिखा है।

 MyPersonalizedUCEvent -= MyPersonalizedUCEventHandler; 
+3

@davymartu लेकिन अपने स्वयं के प्रतिनिधि प्रकार को परिभाषित करने के बजाय, आप आमतौर पर पूर्व निर्धारित लोगों में से एक का प्रयोग करेंगे का एक उदाहरण है, की तरह [EventHandler] (http://msdn.microsoft.com/en-us/library/system.eventhandler.aspx) या [EventHandler ] (http://msdn.microsoft.com/en-us/library/db0etb8x। aspx)। – Clemens

+0

मैंने एक साधारण घटना परिभाषित की है। हालांकि, अगर आप पेरेंट कंटेनर को ईवेंट को बबल करना चाहते हैं तो आपको रूटेड इवेंट बनाना चाहिए और iltzortz उत्तर बताता है कि इसे कैसे बनाया जाए। –

5

सबसे पहले अपनी कक्षा में एक सार्वजनिक समारोह बनाने के लिए:

public event EventHandler<MyEventArgs> SomethingChanged; 

नायबMyEventArgs वस्तु के प्रकार है कि ग्राहकों के लिए घटना के साथ पारित हो जाएगा है। इस उदाहरण के लिए इसे इस तरह हो सकता है:

public class MyEventArgs{ 
    public String Prop1 {get; set;} 
} 

अगला यह आग अपनी कक्षा में के रूप में है:

SomethingChanged?.Invoke(this, new MyEventArgs() { Prop1="test" }); 

Finnally इस तरह इसे संभाल:

private void OnSomethingChanged(object sender, MyEventArgs e) 
{ 
    //TODO 
} 

नायब आप OnSometingChanged विधि में प्रवेश करने के लिए ईवेंट की सदस्यता लेने की आवश्यकता है।इस तरह सदस्यता लें:

myClass.SomethingChanged+=OnSomethingChanged; 

कहाँ myClass वर्ग जहां परिभाषित SomethingChanged

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