2016-04-22 8 views
0

Ich habe ein Projekt, mit Visual Community 2015 entworfen, basierend auf Windows.Form.Zugriff Textfeld von externen Klasse - erhalten keine Fehler

Ich mag ein einfaches Server-Programm realisiert werden - mit der MSDN Library:

https://msdn.microsoft.com/en-us/library/fx6588te%28v=vs.110%29.aspx

So erstelle ich eine einfache Form1 mit dem Designer mit einem RichTextBox (name: LLOG) und eine Taste (click Ereignis pushthebutton), der eine externe Klasse AsynchronousSocketListener aufgerufen hat. danach sollte es sein, eine methode logme() aufzurufen und eine messagebox erscheint (es funktioniert, ich sehe das). Aber ich kann nicht in den RichTextbox-Llog schreiben. Ich bekomme keine Fehler, aber nichts steht in der Box. Ich kann mich erinnern, dass es etwas mit dem Aufruf- oder Delegierten-Problem zu tun hat. aber ich kann es nicht herausfinden. Ich steckte hier seit 5 Stunden ohne Lösung. Kann mir jemand helfen - was muss ich tun, um von der AsynchronousSocketListener() Klasse auf die Box zuzugreifen? Ich weiß nicht, warum ich keine Fehler bekomme!

Sie sehen, meinen letzten Versuch - ich versuche auch das Formular als Parameter bei jedem Aufruf Methode zu analysieren (nichts funktioniert) - aber ich kann nicht glauben, das ist der richtige Weg ...

ps: schlechtes Englisch, ich wissen ...

// Form1.cs - I reduced it to the min - a window with a textbox and a button appears 
namespace MyProject 
{ 
    public partial class Form1 : Form {} 


    public void pushthebutton() { 
    AsynchronousSocketListener srv = new AsynchronousSocketListener(); 
     srv.StartListening(); 
    } 

} 



// AsynchronousSocketListener.cs 
namespace MyProject 
{ 
    public class AsynchronousSocketListener : Form1 
    { 
     // Thread signal. 
     public static ManualResetEvent allDone = new ManualResetEvent(false); 
     public Form1 form; 

     public AsynchronousSocketListener() 
     { 
      form = new Form1(); 
      logme(this, "constructer"); 
     } 


     public void logme(Form1 form, string s) 
     { 

      MessageBox.Show("inside logme"); 

       if (llog.InvokeRequired) 
       { 
        // invoke needed 
        form.llog.Invoke((MethodInvoker)delegate { llog.AppendText("\r\n" + s); llog.ScrollToCaret(); }); 
       } 
       else 
       { 
        // no invoke needed 
        llog.AppendText("\r\n" + s); 
        llog.ScrollToCaret(); 
       } 

     } 
    } 
} 

// inside FormDesigner.cs - shortcut; box is public... 
    public System.Windows.Forms.RichTextBox llog; 

Antwort

0

ich habe nicht WinForms in immer verwendet wird, so dass ich weiß nicht, ob dies eine gute Praxis, aber in AsynchronousSocketListener, alles, was Sie tun, ist ein neues form instanziieren, dass ist an nichts gebunden. Vielleicht möchten Sie tatsächlich Ihre Form in dort

public AsynchronousSocketListener(Form1 parent) 
{ 
    form = parent; 
    logme(this, "constructer"); 
} 

passieren und in Form1

AsynchronousSocketListener srv = new AsynchronousSocketListener(this); 

Auf einer Seite beachten, ich verstehe nicht, warum AsynchronousSocketListener von Form1 erbt wie in der gesehen Linie public class AsynchronousSocketListener : Form1 das scheint nichts zu bewerkstelligen

+0

Vielen Dank - das funktioniert für mich - auch für den Hinweis auf das erbende Form1 macht keinen Sinn.Ich habe so viele diffi versucht kultische Wege, dies zum Funktionieren zu bringen, so habe ich diese Aufgabe jetzt gestrichen. Zu dieser Zeit habe ich auch Probleme, in das Textfeld zu schreiben, weil ich eine Fehlermeldung bekommen habe (Threadprozess kann nicht in das Feld schreiben - und ich werde es später herausfinden), aber im Allgemeinen funktioniert es für mich. Groß! –