Append text to a RichTextBox from another class in VB.NET

I have a Form (ClientGUI) that has a RichTextBox. What I want to do is to append text to this RichTextBox from a Sub located in another class (MyQuickFixApp). I know that the Sub works, because the debugger go through, but it doesn't append the text to my RichTextBox.

How do I do that ?

Thanks for you help !


ClientGUI.vb :

Imports QuickFix
Imports QuickFix.Transport
Imports QuickFix.Fields

Public Class ClientGUI
    Dim initiator As SocketInitiator

    Public Sub ClientGUI_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim filename As String = "Resources/initiator.cfg"
        Dim settings As New SessionSettings(filename)
        Dim myApp As New MyQuickFixApp()

        Dim storeFactory As New FileStoreFactory(settings)
        Dim logFactory As New FileLogFactory(settings)

        initiator = New SocketInitiator(myApp, storeFactory, settings, logFactory)
    End Sub

    Public Sub ConnectToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ConnectToolStripMenuItem.Click
        ToolStripDropDownButton1.Text = "Establishing connection..."
        ToolStripDropDownButton1.Image = My.Resources.Connecting
        initiator.Start()
    End Sub

    Public Sub DisconnectToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles DisconnectToolStripMenuItem.Click
        ToolStripDropDownButton1.Text = "Disconnecting..."
        ToolStripDropDownButton1.Image = My.Resources.Disconnecting
        initiator.Stop()
    End Sub
End Class

MyQuickFixApp.vb :

Imports QuickFix
Imports QuickFix.Transport
Imports QuickFix.Fields

Public Class MyQuickFixApp
    Inherits MessageCracker : Implements IApplication

    Dim _session As Session = Nothing

    Public Sub FromAdmin(message As Message, sessionID As SessionID) Implements IApplication.FromAdmin
        ClientGUI.RichTextBox1.AppendText("")
        ClientGUI.RichTextBox1.AppendText("IN (ADMIN): " + message.ToString())

        Try
            Crack(message, sessionID)
        Catch ex As Exception
            ClientGUI.RichTextBox1.AppendText("")
            ClientGUI.RichTextBox1.AppendText("==Cracker exception==")
            ClientGUI.RichTextBox1.AppendText(ex.ToString())
            ClientGUI.RichTextBox1.AppendText(ex.StackTrace)
        End Try
    End Sub

    Public Sub FromApp(message As Message, sessionID As SessionID) Implements IApplication.FromApp
        ClientGUI.RichTextBox1.AppendText("")
        ClientGUI.RichTextBox1.AppendText("IN (APP): " + message.ToString())

        Try
            Crack(message, sessionID)
        Catch ex As Exception
            ClientGUI.RichTextBox1.AppendText("")
            ClientGUI.RichTextBox1.AppendText("==Cracker exception==")
            ClientGUI.RichTextBox1.AppendText(ex.ToString())
            ClientGUI.RichTextBox1.AppendText(ex.StackTrace)
        End Try
    End Sub

    Public Sub ToApp(message As Message, sessionId As SessionID) Implements IApplication.ToApp
        Try
            Dim possDupFlag As Boolean = False
            If (message.Header.IsSetField(Tags.PossDupFlag)) Then
                possDupFlag = Converters.BoolConverter.Convert(message.Header.GetField(Tags.PossDupFlag))
            End If
            If (possDupFlag) Then
                Throw New DoNotSend()
            End If
        Catch ex As FieldNotFoundException
            ClientGUI.RichTextBox1.AppendText("OUT (APP): " + message.ToString())
        End Try
    End Sub

    Public Sub OnCreate(sessionID As SessionID) Implements IApplication.OnCreate
        '_session = Session.LookupSession(sessionID)
        ClientGUI.RichTextBox1.AppendText("Session created - " + sessionID.ToString())
    End Sub

    Public Sub OnLogon(sessionID As SessionID) Implements IApplication.OnLogon
        ClientGUI.RichTextBox1.AppendText("Logon - " + sessionID.ToString())
        ClientGUI.ToolStripDropDownButton1.Text = "Connected"
        ClientGUI.ToolStripDropDownButton1.Image = My.Resources.Connected
        'MsgBox("onlogon")
    End Sub

    Public Sub OnLogout(sessionID As SessionID) Implements IApplication.OnLogout
        ClientGUI.RichTextBox1.AppendText("Logout - " + sessionID.ToString())
        ClientGUI.ToolStripDropDownButton1.Text = "Disconnected"
        ClientGUI.ToolStripDropDownButton1.Image = My.Resources.Disconnected
    End Sub

    Public Sub ToAdmin(message As Message, sessionID As SessionID) Implements IApplication.ToAdmin
        ClientGUI.RichTextBox1.AppendText("OUT (ADMIN): " + message.ToString())
    End Sub

    Public Sub OnMessage(message As FIX42.Heartbeat, sessionID As SessionID)
        ClientGUI.RichTextBox1.AppendText("HEARTBEAT")
    End Sub
End Class

Upvotes: 0

Views: 1262

Answers (2)

Chris
Chris

Reputation: 8647

I guess that the code in MyQuickFixApp class access to the default instance of your ClientGUI, not the instance which is actually running, each time you write ClientGUI.(...).

See this thread Why is there a default instance of every form in VB.Net but not in C#? for more information about default instance, which is something you should avoid to use.

So you could add a parameter in the MyQuickFixApp class constructor :

 Public Class MyQuickFixApp
    Inherits MessageCracker : Implements IApplication

    Dim _clientGUI As ClientGUI = Nothing
    Public Sub New(cltGui As ClientGUI)
        _clientGUI = cltGui
    End sub

    (...)
End class

Then, replace in the MyQuickFixApp class all the ClientGUI.(...), with _clientGUI.(...) to be sure to access to the correct instance.

And finally, initialize your MyQuickFixApp class in ClientGUI like this:

Dim myApp As New MyQuickFixApp(me)

Note that this code, you can only access to the method of the class in the Form_Load event. This variable should be declared in the class and initialized in the form_load if you want to access it later from the ClientGUI form.

Public Class ClientGUI
    Dim initiator As SocketInitiator
    Dim myApp As MyQuickFixApp()

    Public Sub ClientGUI_Load(sender As Object, e As EventArgs) Handles MyBase.Load
       (...)
       myApp =New MyQuickFixApp(Me)
       (...)
    End Sub

     (...)
End Class

Upvotes: 1

Neeraj Kumar Gupta
Neeraj Kumar Gupta

Reputation: 2363

In Form

    private void button3_Click(object sender, EventArgs e)
    {
        TestClass tc = new TestClass();

        tc.addComment(richTextBox1);
    }

In Class

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

public class TestClass
{
    public void addComment(RichTextBox rt) 
    {
        rt.Text = rt.Text + Environment.NewLine + "My Dynamic Text";
    }
}

you can do it same in VB.net also

Upvotes: 0

Related Questions