vb.net: Control auf Hauptfenster von einem Unterfenster aus kontrollieren.

SpongeStone

Grünschnabel
Hallo zusammen

Nehmen wir mal an, ich habe zwei Formulare.
Form1, bestückt mit einem Label. (Label1)
Form2, bestückt mit einem Button (Button1)
Nun möchte ich, dass beim Druck des Buttons der text des Labels auf Form1 geändert wird.

Ich wühl hier nun schon seit stunden, kann aber nichts brauchbares finden :/ (ist das wirklich so einfach, dass hier keiner fragt?!)

Bei meiner rumbastelei ist bisher folgendes rausgekommen
Code:
Public Class Form2
    Inherits System.Windows.Forms.Form

#Region " Vom Windows Form Designer generierter Code "
   ' *schnipp schnapp*
#End Region

    dim Fmain as Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Fmain.Label1.Text = "blah"
    End Sub
End Class

Da beschwert er sich bloss :/
Eine nicht behandelte Ausnahme des Typs 'System.NullReferenceException' ist in test.exe aufgetreten.

Da hat doch bestimmt wer eine Lösung für mich parat, oder?
Danke schonmal :)

Grüße vom Schwamm
 
danke sehr

Ich kann mit C# leider recht wenig anfangen ... :confused: (mit vb.net eigentlich auch nicht)
...*mal ein wenig drin rumrühr*... Hoppla, hier hab Ich schon ein InitializeComponent ... kann es sein, dass man sich das ganze gerühre in vb.net spaaren kann? :/ jopp scheint so.

Code:
public int Id 
{
	get { return this.id; }
	set { this.id = value; }
}
huh?
Freakig, was hier alles so möglich ist, aber wie funktioniert sowas in vb.net?!

Wär jemand von euch so nett, mir das vorzukauen?

p.s. bin Ich hier überhaupt im richtigen Forum? Ich bin ein wenig verwirrt, weil's ja eine kategorie ".NET" und eine "Visual Basic" gibt.

Grüße, Sponge
 
Das hat generell nichts mit VB.NET zu tun sondern mit OOP im Allgemeinen. Wie es im dann aussieht hängt von der eingesetzten Sprache ab. In VB.Net würde ich das allerdings mit Properties lösen.
Der Code bedeutet folgendes. Du hast eine aktuelle Instanz eines Objektes. Mit dem this-Zeiger greifst du auf diese Instant zu. Die Klasse von der du die Instanz erstellt hat eine variable I. Mit den beiden funktionen ließt du die Veriable aus bzw. setzt diese. Diese Methoden heißen im Allgemeinen getter und setter. Im VB:NET gibt es aber wie gesagt Properties die das genauso machen.
 
Ob C# oder VB.NET ist eigentlich nebensächlich ;-) Es gibt Tools, welche das eine ins andere konvertieren können. Die meisten davon sind kostenlos.

Wie eine Property in C# aussieht, weißt du ja bereits, hier ein Beispiel für VB.NET
Code:
    Private _errorMessage As String

    Public Property ErrorMessage As String
        Get
            Return Me._errorMessage
        End Get
        Set(ByVal value As String)
            Me._errorMessage = value
        End Set
    End Property

Das Gegenstück zu this in C# ist Me in VB.NET.

Weitere Informationen dazu findest du zb. hier:
http://www.galileocomputing.de/openbook/visual_basic/Kapitel_04-004.htm#Xxx1000461
 
Na wunderbar, kommunikation von 1 nach 2 klappt

Code:
Public Class Form1
    Inherits System.Windows.Forms.Form

#Region " Vom Windows Form Designer generierter Code "
   '*cut* Form1 mit Button1
#End Region

   dim Fremote as new form2()

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       Fremote.output = "blah"
       Fremote.Show
    End Sub
End Class
Code:
Public Class Form2
    Inherits System.Windows.Forms.Form

#Region " Vom Windows Form Designer generierter Code "
   '*cut* Form2 mit Label1
#End Region

   public property output() as string
      get
         return Label1.Text
      end get
      set(byval _text as String)
         Label1.Text = _text
      end set
   end property

End Class


Warum macht man das nicht einfach so?
Code:
Public Class Form1
    Inherits System.Windows.Forms.Form

#Region " Vom Windows Form Designer generierter Code "
   ' *cut* Form1 mit Button1
#End Region

   dim Fremote as new form2()

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       Fremote.Label1.Text = "blah"
       Fremote.Show
    End Sub
End Class

So hab Ich mir das ungefär vorgestellt ... nun noch andersrum ...

Wie Ich es schon fast vermutet hab, brauch Ich hier nun die property ...

Also:

Code:
Public Class Form1
    Inherits System.Windows.Forms.Form

#Region " Vom Windows Form Designer generierter Code "
   '*cut* Form1 mit Label1
#End Region

   dim Fremote as new form2()

   public property output() as string
      get
         return Label1.Text
      end get
      set(byval _text as String)
         Label1.Text = _text
      end set
   end property

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       Fremote.Show
    End Sub
	
End Class
Code:
Public Class Form2
    Inherits System.Windows.Forms.Form

#Region " Vom Windows Form Designer generierter Code "
   '*cut* Form2 mit Button1
#End Region

   dim Fmain as Form1
   
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Fmain.output = "blubb"
    End Sub
End Class
:/
Eine nicht behandelte Ausnahme des Typs 'System.NullReferenceException' ist in test.exe aufgetreten.
Label1 modifiers = public bringt nichts, bei der Form kann man das garnicht setzen, Form1.output = "blubb" mag er eben so wenig und sonst hab Ich keine Ideen

Ihr vielleicht?

besten dank, Schwamm
 
Zuletzt bearbeitet:
Code:
dim Fmain as Form1
alleine ist es nicht. Du musst schon auch eine Referenz über den Konstruktor der Form2 setzen ...

Code:
Public Sub New(ByVal andereForm As Form1)
  Me.Fmain = andereForm
End Sub
 
-.-'

Jetzt blick Ich garnicht mehr durch.

Was soll Ich dem den dann als Parameter übergeben? o_O

Ich --> :confused: <-- verwirrt (total)

Grüße vom schwamm
 
Du musst deiner Form2 eine Referenz auf Form1 übergeben, damit du von Form2 aus auf die Form1 zugreifen kannst.

Zum Beispiel so:
Code:
dim Fremote as new form2(Me)
Dieser Aufruf bedingt jedoch die Änderung, die ich in meiner letzten Post schon angesprochen habe.
 
Sry, Ich kapier's von der Logik schon nicht...

Ah, jetzt doch ... *bastel*

Juhu, es funktioniert :)

Code:
Public Class Form1
    Inherits System.Windows.Forms.Form

#Region " Vom Windows Form Designer generierter Code "
   '*cut* Form1 mit Label1
#End Region

    dim Fremote as New Form2(me)

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       Fremote.Show
    End Sub

   public property output() as string
      get
         return Label1.Text
      end get
      set(byval _text as String)
         Label1.Text = _text
      end set
   end property

End Class
Code:
Public Class Form2
    Inherits System.Windows.Forms.Form

#Region " Vom Windows Form Designer generierter Code "
   '*cut* Form2 mit Button1
#End Region

    public Fmain as Form1 

    Public Sub New(ByVal andereForm As Form1)
      me.new()
      Me.Fmain = andereForm
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Fmain.output = TextBox1.Text
    End Sub
End Class
Vielen dank für die Hilfe :)

Grüße vom Schwamm
 

Neue Beiträge

Zurück