2010-09-07 17 views
6

मैं एक बटन है कि जब यह धक्का दिया है एक नया स्ट्रिंग बक्सेंग # 4 पर्यवेक्षक कार्यान्वयन

क्या मैं गलत कर रहा हूँ

somone Inlight मुझे क्यों इस कोड काम करता है नहीं करता सकते में showen है करना चाहते हैं? ...

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public event Startdelegate StartEvent; 
     myButton button; 
     newTb[] tb; 
     public Form1() 
     { 
      InitializeComponent(); 

      button = new myButton(); 
      button.Parent = this; 
      button.Location = new Point(120, 0); 
      button.Text = "click on me!!!"; 
      tb = new newTb[8]; 

      for (int i = 0; i <= 80; i += 15) 
      { 
       tb[i/15] = new newTb(); 
       tb[i/15].Parent = this; 
       tb[i/15].Location = new Point(i + i, i + i); 
       // button.Subscribe(tb[i/15]); 
      } 

      button.Click += new EventHandler(button_Click); 

     } 
     private void button_Click(object sender, EventArgs e) 
     { 
      button.s = "this is clicking"; 
      //button.Notify(); 
     } 
    } 

    public class myButton : Button, IObservable<newTb> 
    { 
     public string s; 
     private List<IObserver<newTb>> observers; 

     public myButton() 
     { 
      observers = new List<IObserver<newTb>>(); 
     } 

     public IDisposable Subscribe(IObserver<newTb> observer) 
     { 
      if (!observers.Contains(observer)) 
      { 
       observers.Add(observer);   
      } 
      return new Unsubscriber(observers, observer); 
     } 

     protected void Notify(newTb tb) 
     { 
      foreach (IObserver<newTb> observer in observers) 
      { 
       observer.OnNext(tb); 
      } 
     } 

     #region Unsubscriber 
     private class Unsubscriber : IDisposable 
     { 
      private List<IObserver<newTb>> observers; 
      private IObserver<newTb> observer; 

      public Unsubscriber(List<IObserver<newTb>> observers, IObserver<newTb> observer) 
      { 
       this.observers = observers; 
       this.observer = observer; 
      } 

      public void Dispose() 
      { 
       if (observer != null && observers.Contains(observer)) 
       { 
        observers.Remove(observer); 
       } 
      } 
     } 
     #endregion 

     class newTb : TextBox, IObserver<string> 
     { 
      string s; 
      public void OnCompleted() { } 
      public void OnError(Exception error) { } 
      public void OnNext(string value) 
      { 
       this.Text = value; 
      } 
     } 
    } 
} 
+0

+1 बस इतना है कि आप कुछ और अंक अर्जित करने के लिए कुछ अंक प्राप्त कर सकते हैं :-) – SKG

+0

यदि उत्तर सही है, तो आपको प्रश्न के उत्तर के रूप में चिह्नित करना चाहिए ताकि बक्षीस से सम्मानित किया जा सके। –

+0

लेकिन यह इम्प्लामेंट का एक और तरीका नहीं है जिसे मैं अपने उदाहरण में msdn में करता हूं क्योंकि –

उत्तर

5

http://msdn.microsoft.com/en-us/library/dd783449.aspx

के अनुसार IObserver और IObservable इंटरफेस धक्का-आधारित अधिसूचना, भी पर्यवेक्षक डिजाइन पैटर्न के रूप में जाना के लिए एक सामान्यीकृत तंत्र प्रदान करते हैं। IObservable इंटरफ़ेस उस वर्ग का प्रतिनिधित्व करता है जो सूचनाएं (प्रदाता) भेजता है; IObserver इंटरफ़ेस उस वर्ग का प्रतिनिधित्व करता है जो उन्हें प्राप्त करता है (पर्यवेक्षक)।

टी उस वर्ग का प्रतिनिधित्व करता है जो अधिसूचना जानकारी प्रदान करता है।

आपके मामले में आपके द्वारा दी गई जानकारी एक संदेश (एक स्ट्रिंग) है। अपने नमूना में आप स्थानों में हर बात पतन के बाद घोषणा

public class ObservableButton : Button, IObservable<string> {} 
    public class ObserverTextBox : TextBox, IObserver<string>  {} 

के साथ नियंत्रण newTB

गुजर रहे थे।

कक्षा ओब्सर्वेबल बटन की विधि को इस तरह लिखा जा सकता है।

public void Notify(string text) 
    { 
     foreach (IObserver<string> observer in _Observers) 
     {     
      observer.OnNext(text); 
     } 
    } 
यहाँ

पूर्ण स्रोत कोड

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 ObservableDemo 
{ 
    public class ObservableButton : Button, IObservable<string> 
    { 
     private List<IObserver<string>> _Observers; 

     public ObservableButton() 
     { 
      _Observers = new List<IObserver<string>>(); 
     } 
     IDisposable IObservable<string>.Subscribe(IObserver<string> observer) 
     { 
      if (!_Observers.Contains(observer)) 
      { 
       _Observers.Add(observer); 
      } 
      return new Unsubscriber(_Observers, observer); 
     } 
     public void Notify(string text) 
     { 
      foreach (IObserver<string> observer in _Observers) 
      {     
       observer.OnNext(text); 
      } 
     } 
     private class Unsubscriber : IDisposable 
     { 
      private List<IObserver<string>>  observers; 
      private IObserver<string>   observer; 

      public Unsubscriber(List<IObserver<string>> observers, IObserver<string> observer) 
      { 
       this.observers = observers; 
       this.observer = observer; 
      } 
      public void Dispose() 
      { 
       if (observer != null && observers.Contains(observer)) 
       { 
        observers.Remove(observer); 
       } 
      } 
     } 
    } 
} 

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 ObservableDemo 
{  
    public class ObserverTextBox : TextBox, IObserver<string> 
    { 
     private IDisposable unsubscriber; 

     void IObserver<string>.OnCompleted() 
     { 
     } 
     void IObserver<string>.OnError(Exception error) 
     { 

     } 
     void IObserver<string>.OnNext(string value) 
     { 
      this.Text = value; 
      this.Refresh(); 
     } 
     public virtual void Subscribe(IObservable<string> provider) 
     { 
      if (provider != null) 
       unsubscriber = provider.Subscribe(this); 
     } 
     public virtual void Unsubscribe() 
     { 
      unsubscriber.Dispose(); 
     } 
    }  
} 

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 ObservableDemo 
{ 
    public partial class Form1 : Form 
    { 
     ObservableButton button; 

     public Form1() 
     { 
      InitializeComponent(); 

      button   = new ObservableButton(); 
      button.Parent = this; 
      button.Location = new Point(120, 0); 
      button.Text  = "click on me!!!"; 
      button.Click += new EventHandler(button_Click); 

      for (int i = 0; i < 8; i++) 
      { 
       ObserverTextBox tb = new ObserverTextBox(); 
       tb.Parent   = this; 
       tb.Location   = new Point(0 , 30+(i*30)); 
       tb.Width   = 300; 
       tb.Subscribe(button); 
      } 
     } 
     private void button_Click(object sender, EventArgs e) 
     { 
      button.Notify(String.Format("{0} this is the message", DateTime.Now)); 
     } 
     void Form1_Load(object sender, System.EventArgs e) 
     { 
     } 
    } 
} 
+0

धन्यवाद, यह काम करता है कि आप कुछ तथ्यों के साथ प्रकाश में काम कर सकते हैं, मुझे समझ में नहीं आता कि मुझे गलत कहाँ मिला है –

+0

वास्तव में मुझे IObserver/IObservable पैटर्न में भी समस्या है। मैं आज रात स्क्रैच से आपकी समस्या लिखने की कोशिश करूंगा। –

+0

आपको बहुत बहुत धन्यवाद। –

1

मेरा मानना ​​है कि यह आपकी समस्या हो सकती है:

:

class newTb : TextBox, IObserver<string> 

क्या आप क्या आप इस नमूने के आधार पर निरीक्षण करने के लिए करना चाहता था क्योंकि

observers = new List<IObserver<newTb>>(); 

वास्तव में IObser है ver <newTb>, जो IObserver < स्ट्रिंग > से भिन्न प्रकार है। आपकी नई टीबी कक्षा पहले इंटरफ़ेस को लागू नहीं करती है, यह केवल बाद वाले को लागू करती है। यह सुनिश्चित नहीं है कि यह क्यों संकलित करता है (यदि यह करता है), हालांकि।

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