Forum: PC-Programmierung C# Programmierung! Bitte um hilfe


von versus (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe ein fertiges Form 1, wie mach ich ein neues Form 2 was auf den 
ersten Form aufbaut und abhängig ist.
(Auf Form2 sollen nur die Punkte angezeigt werden und die zeit vom 
Form1)

Form1 sollte die hauptsteuerung sein zb Auf dem ersten Bildschirm 
anzeigen
Form2 sollte nur von ein abhängigsein und auf dem 2ten Bildschirm 
anzeigen

Ich bitte um schnelle rückmeldungen.

von Sven (Gast)


Lesenswert?

Windows Forms sind eigentlich ganz normale Klassen. Nur sind die 
Steuerelemente 'private'. Füge in deinem Ziel-Form eine Methode ein, die 
'public' ist und das Ziel-Steuerelement füllt.

In dem Quell-Form fügst du ein Attribut ein, dass deine Form 
repräsentiert. Jetzt kannst du die vorher definierte Methode in deinem 
Ziel-Form aufrufen. Natürlich musst du dein Ziel-Form vorher noch 
initialiiseren und anzeigen.
1
public partial class Form1 : Form
2
{
3
  private Form2 _form2;
4
  
5
  public Form1()
6
  {
7
    InitializeComponent();
8
9
    this._form2 = new Form2();
10
    this._form2.Show();
11
  }
12
13
  private void button1_Click(object sender, EventArgs e)
14
  {
15
    this._form2.SetTextBox1(this.textBox1.Text);
16
  }
17
}
18
19
public partial class Form2 : Form
20
{
21
  public Form2()
22
  {
23
    InitializeComponent();
24
  }
25
26
  public void SetTextBox1(string s)
27
  {
28
    this.textBox1.Text = s;
29
  }
30
}

von versus (Gast)


Lesenswert?

Hast du ICQ, SKYPE oder was ähnliches.! wo ich dir es rüberschicken kann 
und du fügst es ein.
Ich habe schon so vieles ausprobiert und bekomme immer fehler meldung 
wen ich etwas auf Form2 beziehen will oder ich mach es einfach falsch...

von Sebastian L. (Gast)


Lesenswert?

Lol

da hat wohl jemand die Hausaufgaben vergessen was?
das Stichwort heißt Properties.

Danach einfach suchen dann wirds scho.

von versus (Gast)


Lesenswert?

Ich suche seit ca. 2 wochen und das die ganzen tage :/,
das was ich fand war entweder zu komplex oder funktionierte gar nicht.
Mein Programm habe ich fertig Programmiert, alles ist fertig.
Wollte es nur noch mit Form 2 machen, was mir aber leider nicht gelingt.

From2 geht auf aber er bezieht keine Werte von Form1 ...

von Sven (Gast)


Lesenswert?

Legt doch bitte ein neues Projekt an und kopiere den oben gezeigten 
Quelltext hinein.
Das Form1 hat ein Textfeld und einen Button. Das From2 hat nur ein 
Textfeld.
Entscheidend ist die Variable _form2. Hier liegt die Referenz auf deine 
Form2. Über diese Variable bekommst du Zugriff auf dein Form2!

Wenn du einen Fehler bekommst, ist es kein Nachteil diesen zu posten...

MfG Sven

von versus (Gast)


Lesenswert?

Ich danke dir für die schnelle hilfe Sven, das was du beschrieben hast 
geht auch einbanfrei, genau so soll das Programm auch funktionieren.

Das Problem ist nur wie soll man es mit "numericUpDown1" machen ?
er übernimmt einfach nicht die werte, ...

von Sven (Gast)


Lesenswert?

Das Steuerelement hat natürlich keine 'Text'-Eigenschaft. Die 
Eigenschaft in dem der richtige Wert steht ist 'Value'.
Hier brauchst du im Quell-Form einen Ereignishandler auf dem Ereignis 
'ValueChanged' des Steuerelements 'numericUpDown1'

Das sollte dann ungefähr so aussehen:
1
private void numericUpDown1_ValueChanged(object sender, EventArgs e)
2
{
3
    this._form2.SetNumericUpDown1(this.numericUpDown1.Value);
4
}

Im Ziel-Form braucht du natürlich wieder eine Funktion die den Wert 
setzt. Wie Sebastian richtig angemerkt hat, geht das auch mit einer 
Property. Wenn du so was noch nich kannst, verwende eine Funktion.
1
public void SetNumericUpDown1(decimal i)
2
{
3
    this.numericUpDown1.Value = i;
4
}

Das funktioniert natürlich nur in eine Richtung (Form1 -> Form2). Für 
die andere Richtung würde das natürlich auch funktionieren, nur brauchst 
du dann mehr Code. Ich würde im Ziel-Form deswegen ein Textfeld 
benutzen.

MfG Sven

von versus (Gast)


Lesenswert?

Hier ist mein numerincUpDown1, wen ich auf dem button klicke addiert er 
+1 zu der numerincUpDown1 Anzeige. Durch button will ich nur die Value 
bestimmen was ich ja auch schon habe.

        private void button1_Click(object sender, EventArgs e)
        {
            //this._form2.SetTextBox1(this.textBox1.Text);

            if (this.numericUpDown1.Value <= 11)
            {
                this.numericUpDown1.Value += 1;
            }
        }

Irg. wie klappt das wieder nicht :/,  wo muss ich was einfügen ? ich 
bekomme immer den selben fehler .

            private void numericUpDown1_ValueChanged(object sender, 
EventArgs e)
        {
            this._form2.numericUpDown1(this.numericUpDown1.Value);
        }
Fehler  1  Der Zugriff auf 
"WindowsFormsApplication1.Form2.numericUpDown1" ist aufgrund der 
Sicherheitsebene nicht möglich.
---
Kann ich eig. auch von numericUpDown (Form1) zu weisen auf 
Textfeld(Form2)
Wen es leichter ist dann würde ich gerne dafür den Programmier code 
bekommen, wen du weißt wie es geht, bin echt schon am verzweifeln.

von Sven (Gast)


Lesenswert?

Den Code hast du doch schon. Schau einfach in mein letztes Posting :-(. 
Wie ich schon weiter oben gesagt habe, kannst du nicht direkt auf ein 
Steuerelement von Form2 zugreifen. Mache es immer über eine Funktion 
oder eine Property.
Kopiere doch den Code immer zuerst in das Testprojekt und versuche den 
Code zu verstehen, sonst wird das nichts...

MfG Sven

von Rocky B. (bitrocker)


Lesenswert?

Du sprichst die Controls von der Form2 direkt mit dem Namen an, dann 
kannst du dieses vom Form1 aus beeinflussen.

Example:

Form1 und Form2 mit jeweils einem NumericUpDown.
1
public partial class Form1 : Form
2
{
3
    Form2 cf;
4
5
    public Form1()
6
    {
7
        InitializeComponent();
8
9
        cf = new Form2();            
10
        cf.Show();
11
    }
12
13
    private void numericUpDown1_ValueChanged(object sender, EventArgs e)
14
    {
15
        cf.Controls["numericUpDown1"].Text = numericUpDown1.Value.ToString();
16
    }
17
}

Das Property "Text" von Controls wird mit einem Referenzwert (String) 
initialisiert und stellt den Ausgabewert (Value) vom NumericUpDown auf 
Form2 dar.

von Sharping (Gast)


Lesenswert?

Rocky B. schrieb:
> Du sprichst die Controls von der Form2 direkt mit dem Namen an, dann
> kannst du dieses vom Form1 aus beeinflussen.

Da geht die Wartbarkeit aber komplett flöten. Auch wenn's funktioniert: 
von diesem Ansatz würde ich die Finger lassen ;-)

von A. V. (kra5h)


Angehängte Dateien:

Lesenswert?

Heyho,

also ich würde das Anzeigen durch eine "numericUpDown" auf der 2. Form 
ungefähr so realisieren:

Form1:
1
using System;
2
using System.Collections.Generic;
3
using System.ComponentModel;
4
using System.Data;
5
using System.Drawing;
6
using System.Linq;
7
using System.Text;
8
using System.Windows.Forms;
9
10
namespace numericUpDown2Forms
11
{
12
    public partial class Form1 : Form
13
    {
14
15
        public delegate void NumericUpDownValueChanged_Delegate(decimal value);
16
        public static event NumericUpDownValueChanged_Delegate NumericUpDownValueChanged;
17
18
        public Form1()
19
        {
20
            InitializeComponent();
21
            NumericUpDownValueChanged += new NumericUpDownValueChanged_Delegate(Form1_NumericUpDownValueChanged);
22
        }
23
24
        void Form1_NumericUpDownValueChanged(decimal value)
25
        {
26
            label1.Text = "Value: " + value;
27
        }
28
29
        private void numericUpDown1_ValueChanged(object sender, EventArgs e)
30
        {
31
            NumericUpDownValueChanged(((NumericUpDown)sender).Value);
32
        }
33
34
        private void button1_Click(object sender, EventArgs e)
35
        {
36
            Form2 form2 = new Form2(numericUpDown1.Value);
37
            form2.Show();
38
        }
39
    }
40
}

Form2:
1
using System.Text;
2
using System.Windows.Forms;
3
4
namespace numericUpDown2Forms
5
{
6
    public partial class Form2 : Form
7
    {
8
        public Form2(decimal value)
9
        {
10
            InitializeComponent();
11
            numericUpDown1.Value = value;
12
            Form1.NumericUpDownValueChanged += new Form1.NumericUpDownValueChanged_Delegate(Form1_NumericUpDownValueChanged);
13
        }
14
15
        void Form1_NumericUpDownValueChanged(decimal value)
16
        {
17
            numericUpDown1.Value = value;
18
        }
19
    }
20
}

Allerdings würde ich allgemein Felder, auf die auch die 2. Form 
zugreifen kann "public static" machen und dann wieder mit delegate/event 
arbeiten.

z.B.:
1
...
2
public delegate void Wert1Changed_Delegate(int value);
3
        public static event Wert1Changed_Delegate Wert1Changed;
4
        private static int _Wert1;
5
        public static int Wert1
6
        {
7
            get
8
            {
9
                return _Wert1;
10
            }
11
            set 
12
            {
13
                _Wert1 = value;
14
                Wert1Changed(value);
15
            }
16
        }
17
...

Oder so ähnlich.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.