Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Andere Windows Form und dessen Control ansprechen?

46 views
Skip to first unread message

Mike Struth

unread,
Apr 8, 2004, 1:32:19 PM4/8/04
to
Hallo...

Ich möchte wie es in VB6 möglich was ein sagen wir mal
TextBox ansprechen auf einer anderen vom. Also von Form1
aus die Textbox auf Form2.

Füher ging das ja so:
frmMain2.TextBox.Text = "Hallo"

Heute wie geht das dann:
Dim frm as New frmMain2
frm.TextBox.Text = "Hallo"

Das geht nicht und per AktiveForm auch nicht da die Form
im Hintergrund ist und nicht Aktive.

Danke

Arne Janning

unread,
Apr 8, 2004, 2:49:03 PM4/8/04
to
Hallo Mike,

"Mike Struth" schrieb


>Füher ging das ja so:
>frmMain2.TextBox.Text = "Hallo"

Gut, dass das vorbei ist.

>Heute wie geht das dann:
>Dim frm as New frmMain2
>frm.TextBox.Text = "Hallo"

Du könntest z.B. den Konstruktor von frmMain2 überladen:

Public Class frmMain2
Inherits System.Windows.Forms.Form

Public Sub New()
...
End Sub

Public Sub New(byval TextBoxText as String)
me.New()
me.TextBox.Text = TextBoxText
End Sub
...

Nun kannst Du in frmMain1 das frmMain2 aufmachen:
Dim frm2 as frmMain2 = new frmMain2("Hallo OOP")
frm2.Show()


Oder Du könntest in frmMain2 eine öffentliche Methode schreiben, über die
der Zugriff auf die TextBox geregelt wird:

Public Sub SetTextBoxText(byval textBoxText as String)
me.TextBox.Text = textBoxText
End Sub

Nun kannst Du in frmMain1 das frmMain2 aufmachen:
Dim frm2 as frmMain2 = new frmMain2()
frm2.Show()
frm2.SetTextBoxText("Hallo OOP")

HTH

Arne Janning


anon...@discussions.microsoft.com

unread,
Apr 8, 2004, 3:13:36 PM4/8/04
to
Aber ich kann doch nicht für jedes control was ich
ansprechen will ein Sub New schreiben...
Und will ja nicht nur ein control ansprechen können mit
>Nun kannst Du in frmMain1 das frmMain2 aufmachen:
>Dim frm2 as frmMain2 = new frmMain2("Hallo OOP")
>frm2.Show()

das spreicht ja nur die textbox an und nun will ich sagen
wir mal ne listbox ansprechen


>-----Originalnachricht-----


>Hallo Mike,
>
>"Mike Struth" schrieb
>>Füher ging das ja so:
>>frmMain2.TextBox.Text = "Hallo"
>
>Gut, dass das vorbei ist.
>
>>Heute wie geht das dann:
>>Dim frm as New frmMain2
>>frm.TextBox.Text = "Hallo"
>
>Du könntest z.B. den Konstruktor von frmMain2 überladen:
>
>Public Class frmMain2
> Inherits System.Windows.Forms.Form
>
> Public Sub New()
> ...
> End Sub
>
> Public Sub New(byval TextBoxText as String)
> me.New()
> me.TextBox.Text = TextBoxText
> End Sub

>....


>
>Nun kannst Du in frmMain1 das frmMain2 aufmachen:
>Dim frm2 as frmMain2 = new frmMain2("Hallo OOP")
>frm2.Show()
>
>
>Oder Du könntest in frmMain2 eine öffentliche Methode
schreiben, über die
>der Zugriff auf die TextBox geregelt wird:
>
>Public Sub SetTextBoxText(byval textBoxText as String)
> me.TextBox.Text = textBoxText
>End Sub
>
>Nun kannst Du in frmMain1 das frmMain2 aufmachen:
>Dim frm2 as frmMain2 = new frmMain2()
>frm2.Show()
>frm2.SetTextBoxText("Hallo OOP")
>
>HTH
>
>Arne Janning
>
>

>.
>

Arne Janning

unread,
Apr 8, 2004, 5:11:52 PM4/8/04
to
Hallo Mike,

>Aber ich kann doch nicht für jedes control was ich
>ansprechen will ein Sub New schreiben...

ACK

Jetzt bin ich gerade selbst erschrocken:
Der Windows-Forms-Designer für VB.NET erzeugt folgenden Code für die
Controls in einer Form:
(Sorry, programmiere hauptsächlich C#)
FRIEND WithEvents Button1 As System.Windows.Forms.Button

Friend bewirkt, dass die Variable innerhalb der Assembly zugänglich ist.
Das heißt, dass Du im Grunde doch wieder wie in Classic-VB auf die Controls
zugreifen kannst:
(Ist wohl eine Konzession an die Abwärtskompabilität)

In frmMain1:


Dim frm2 as frmMain2 = new frmMain2()

frm2.TextBox.Text = "Hallo Welt"
frm2.Show()

Alles was Du brauchst ist eine Referenz auf (in diesem Fall) frmMain2.

In C# geht das so nicht. Dort werden Controls per default auf "private"
gesetzt, sind also nur in der Klasse selbst sichtbar.

Gruß

Arne

Peter Fleischer

unread,
Apr 8, 2004, 6:44:17 PM4/8/04
to
Mike Struth wrote:
...
> Ich möchte wie es in VB6 möglich was ein sagen wir mal
> TextBox ansprechen auf einer anderen vom. Also von Form1
> aus die Textbox auf Form2.
>
> Füher ging das ja so:
> frmMain2.TextBox.Text = "Hallo"

Mike,
das geht auch heute noch so, wenn frmMain2 in Form1 bekannt sit.

> Heute wie geht das dann:
> Dim frm as New frmMain2
> frm.TextBox.Text = "Hallo"
>
> Das geht nicht und per AktiveForm auch nicht da die Form
> im Hintergrund ist und nicht Aktive.

Warum soll das nicht gehen? Wenn TextBox als Variable in frmMain2 mindestnes
Friend oder auch Public ist, dann sollte das funktionieren. Dat TextBox ein
Klassenname aus dem Framework ist, solltest du wegen Verwechslungen besser
auf andere Namen ausweichen.

Peter

anon...@discussions.microsoft.com

unread,
Apr 11, 2004, 11:58:05 AM4/11/04
to
Hallo...

Nein, ihr versteht nicht so genau was ich will.
Ihr redet immer davon von wegen frm.show. Die Form ist ja
schon offen und soll nicht noch mal neu geöffnet werden.
Als nochmal von vorne.

Wir haben zwei Formen (frm1 und frm2) frm2 beinhaltet
mehrere Controls sagen wir mal eine TextBox und eine
Lisbox. Nun möchte ich aus frm1 diese Controls ansprechen
und Daten übergeben. Also bei textbox zum Beispiel: HAllo
Form2 als Text & bei der Listbox ein neues Item
hinzufügen. Also Listbox.Items.Add("HALLO Form") früher
habe ich immer einfach gesagt frm2.Lisbox1.Item.Add
("Hallo Form2") das geht ja heute nicht mehr. Wie kann
ich es nun anstellen das ich alle Controls ansprechen
kann wenn die Form2 schon sichtbar ist.

Danke

>-----Originalnachricht-----

>.
>

Armin Zingler

unread,
Apr 11, 2004, 12:10:02 PM4/11/04
to
<anon...@discussions.microsoft.com> schrieb

> Hallo...
>
> Nein, ihr versteht nicht so genau was ich will.
> Ihr redet immer davon von wegen frm.show. Die Form ist ja
> schon offen und soll nicht noch mal neu geöffnet werden.
> Als nochmal von vorne.
>
> Wir haben zwei Formen (frm1 und frm2) frm2 beinhaltet
> mehrere Controls sagen wir mal eine TextBox und eine
> Lisbox. Nun möchte ich aus frm1 diese Controls ansprechen
> und Daten übergeben. Also bei textbox zum Beispiel: HAllo
> Form2 als Text & bei der Listbox ein neues Item
> hinzufügen. Also Listbox.Items.Add("HALLO Form") früher
> habe ich immer einfach gesagt frm2.Lisbox1.Item.Add
> ("Hallo Form2") das geht ja heute nicht mehr. Wie kann
> ich es nun anstellen das ich alle Controls ansprechen
> kann wenn die Form2 schon sichtbar ist.

Wenn du auf ein Objekt zugreifen willst, brauchst du eine Referenz. Hast du
keine, musst du sie verfügbar machen. Üblicherweise durch Übergabe an das
Objekt, das die Referenz braucht. Zumeist als Prozedur-Argument.

Früher war die Referenz leider global, ob man wollte oder nicht. Jeder
konnte also am Formular "dranrumpfuschen". Heute ist der Zugriff auf das
Formular auf die Objekte beschränkt, die auch eine Referenz zum Formular
haben. Das macht das Projekt transparenter und die Fehlersuche wird
erleichtert.


--
Armin

Peter Fleischer

unread,
Apr 11, 2004, 12:20:54 PM4/11/04
to
anon...@discussions.microsoft.com wrote:
...

> Wir haben zwei Formen (frm1 und frm2) frm2 beinhaltet
> mehrere Controls sagen wir mal eine TextBox und eine
> Lisbox. Nun möchte ich aus frm1 diese Controls ansprechen
> und Daten übergeben. Also bei textbox zum Beispiel: HAllo
> Form2 als Text & bei der Listbox ein neues Item
> hinzufügen. Also Listbox.Items.Add("HALLO Form") früher
> habe ich immer einfach gesagt frm2.Lisbox1.Item.Add
> ("Hallo Form2") das geht ja heute nicht mehr.

Das geht in VB.NET ganz genau so auch noch. Du musst dich lediglich in
VB.NET darum kümmern, dass in deiner Variablen der Verweis auf die Instanz
deriner Form steht.

Dim frm2 As New myForm2
frm2.Show
...
frm2.Lisbox1.Item.Add("Hallo Form2")

> Wie kann
> ich es nun anstellen das ich alle Controls ansprechen
> kann wenn die Form2 schon sichtbar ist.

frm2.Lisbox1.Item.Add("Hallo Form2")

wobei du dir in der Variablen frm2 den Verweis auf die anzusprechende Form
gemerkt hast.

Eine bessere Lösung ist aber bestimmt die Nutzunjg von Eigenschaften für die
Übergabe der Parameter oder für die Übergabe von Delegates. Auch könnte man
elegant mit Ereignissen arbeiten.

Peter

Herfried K. Wagner [MVP]

unread,
Apr 11, 2004, 2:23:22 PM4/11/04
to
* <anon...@discussions.microsoft.com> scripsit:

> Nein, ihr versteht nicht so genau was ich will.
> Ihr redet immer davon von wegen frm.show. Die Form ist ja
> schon offen und soll nicht noch mal neu geöffnet werden.
> Als nochmal von vorne.
>
> Wir haben zwei Formen (frm1 und frm2) frm2 beinhaltet
> mehrere Controls sagen wir mal eine TextBox und eine
> Lisbox. Nun möchte ich aus frm1 diese Controls ansprechen
> und Daten übergeben. Also bei textbox zum Beispiel: HAllo
> Form2 als Text & bei der Listbox ein neues Item
> hinzufügen. Also Listbox.Items.Add("HALLO Form") früher
> habe ich immer einfach gesagt frm2.Lisbox1.Item.Add
> ("Hallo Form2") das geht ja heute nicht mehr. Wie kann
> ich es nun anstellen das ich alle Controls ansprechen
> kann wenn die Form2 schon sichtbar ist.

Google mal nach "Singleton design pattern".

--
Herfried K. Wagner [MVP]
<URL:http://dotnet.mvps.org/>

Harald Pfitzer

unread,
Apr 11, 2004, 10:29:14 PM4/11/04
to
Hallo Herfried,

füge einfach Propertys in dein Form ein:

'**** frm1 *************************************
private sTextstring1 as String

Public Property prop_Set_Textbox1() As String
Get
Return sTextstring1
End Get
Set(ByVal Value As String)
sTextstring1 = Value
' oder direkt den Inhalt der Textbox im Form setzen
df_Textbox1.text = Value
End Set
End Property
'**********************************************

Angesprochen werden die Propertys einfach mit dem
Formnamen.Propertyname
z.B.:
frm1.prop_Set_Textbox1 = "Hallo"
oder wenn ich mir den Inahlt holen will
sString1 = frm1.prop_Set_Textbox1

Das ganze kannst du für jedes Objekt im Form anwenden

MfG

Harald


Herfried K. Wagner [MVP] schrieb:

Herfried K. Wagner [MVP]

unread,
Apr 12, 2004, 8:11:44 AM4/12/04
to
* Harald Pfitzer <harald....@t-online.de> scripsit:

> füge einfach Propertys in dein Form ein:
>
> '**** frm1 *************************************
> private sTextstring1 as String
>
> Public Property prop_Set_Textbox1() As String
> Get
> Return sTextstring1
> End Get
> Set(ByVal Value As String)
> sTextstring1 = Value
> ' oder direkt den Inhalt der Textbox im Form setzen
> df_Textbox1.text = Value
> End Set
> End Property
> '**********************************************
>
> Angesprochen werden die Propertys einfach mit dem
> Formnamen.Propertyname
> z.B.:
> frm1.prop_Set_Textbox1 = "Hallo"
> oder wenn ich mir den Inahlt holen will
> sString1 = frm1.prop_Set_Textbox1
>
> Das ganze kannst du für jedes Objekt im Form anwenden

Diese Methode setzt aber wiederum voraus, dass du in 'frm2' eine
Referenz auf deine Instanz in 'frm1' besitzt. Ob man nun direkt auf das
Control zugreift oder über eine Eigenschaft, ist da eigentlich egal.

Harald Pfitzer

unread,
Apr 12, 2004, 8:32:36 AM4/12/04
to
Hallo Herfried!

Das mit der Referenz auf die Instanz ist richtig !!!..

MfG
Harald

Herfried K. Wagner [MVP] schrieb:

0 new messages