Autor Beitrag
bfmeb
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: Mo 13.07.09 13:40 
Hallo,

ich habe in meiner Main Form Openfiledialoge, Backgroundworker etc. -->Steuerelemente (liegen am unteren Rand im Ansichten Designer)

..also hoffe jetzt weiß jeder was gemeint ist^^

Meine Main Form ist geschachtelt in 2 Panels. Nun möchte ich die Logik der UI hinter die Panels hauen. dazu muss ich die Steuerelemente ansprechen können, wie mache ich das?

mit getter? oder einer schnittstelle? Das Panel muss ja die Steuerelemente irgendwie kennen lernen...

Danke vielmals..
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 13.07.09 13:44 
Hi!

Was meinst Du mit "hinter die Panels hauen"? :gruebel:

Generell sind die Panels doch nur Felder Deiner Form, wie die Elemente, auf die Du zugreifen möchtest, auch. Ebenso sind die Methoden für die Events der Panels Member Deiner Form. Da sollte es kein Problem mit dem Zugriff geben.

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
bfmeb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: Mo 13.07.09 14:18 
Ich erklär nochmal anders mein Problem:

Wenn ich eine ToolStripBar, die damit verbundene ToolStripProgressBar, BackgroundWorker und Open/SaveFileDialoge meiner Main Form hinzufüge, dann werden diese in dem Komponenten des Form Main Designers initialisiert.

Natürlich kann ich z.B.: buttons des Panels Aktionen zuweisen und diese ansprechen. Ich möchte nun einen Vorgang starten wenn ich auf einen Button des Panels clicke, dazu erzeuge ich logischweise das Klick_Event.

Wenn ich mit dem Klick-Event nun den Backgroundworker der Main Form starten möchte, zeigt mir die Fehlerliste var bgworker ist im aktuellen kontext nicht vorhanden...verstehst du mein problem jetzt besser?
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 13.07.09 14:20 
Das sollte eigentlich kein Problem sein, zeig doch mal die Methode, in der die Fehlermeldung kommt.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
bfmeb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: Mo 13.07.09 14:33 
ParameterControl.cs (Panel 1)

ausblenden C#-Quelltext
1:
2:
3:
4:
        private void LoadXml_Click(object sender, EventArgs e)
        {
            OpenDialogXml.ShowDialog();                
        }


-->ganz simples Beispiel..

OpenDialogXml ist der Name des OpenFileDialoges den ich in der Main Form initialisiert habe.
Das kann doch nicht schwer sein oO
bfmeb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: Di 14.07.09 09:10 
Bitte helft mir ich bin sonst noch am verzweifeln...
Das muss doch übelst simpel gehen, ich muss irgendwie die Main form als parameter übergeben an das Panel oder so in der Art...bin noch nicht so lange dabei...
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 14.07.09 09:26 
Ich verstehe das Problem immer noch nicht so wirklich. Wenn LoadXML_Click eine Methode der Form ist, dann hast Du auf alle Felder (und damit auch Komponenten) der Form Zugriff.

Hilfreich wäre auch, wenn Du mal die Fehlermeldung postest, die er bei dem Code ausgibt.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
bfmeb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: Di 14.07.09 09:41 
Also...

Ich habe einmal meine Hauptform. Dieser habe ich den Backgroundworker und eine ToolStripBar inkl. ProgressBar zugefügt im Ansichten Designer.
Das ist meine Klasse MainForm...total simpel.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
public partial class MainForm : Form
{
        public MainForm()
        {
            InitializeComponent();
        }

....

}


Diese MainForm lädt 2 Panels. Die wiederum eigene Klassen sind. Die Panels sind auf der MainForm.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
public partial class ParameterControl : UserControl
    {

        public ParameterControl()
        {
            InitializeComponent();
        }

        private void LoadXml_Click(object sender, EventArgs e)
        {
            openFileXml.ShowDialog(); //-->Fehler Der Name "openFileXml" ist im aktuellen
                                           Kontext nicht vorhanden.  
        }


Ich habe den Dialog openFileXml aber der MainForm hinzugefügt und möche nun aus dem Panel auf das Element zugreifen...

ich hoffe jetzt ist es klar ;( sorry wenn ich nicht das Know how hab um mein problem klärend genug zu schildern...

ist das überhaupt ein panel?!!
bfmeb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: Di 14.07.09 10:06 
Auweia!
Ich bin blöd, ich habe ein Control und kein Panel...
Das tut mir jetzt aber wirklich Leid, ich sollte mich besser vorher genaustens informieren.
*Peinlich*

Die Frage bleibt aber trotzdem die selbe, ich will von meinem Control aus auf Steuerelemente der MainForm zugreifen...

Ich bitte nochmals um Verzeihung!
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Di 14.07.09 10:43 
Hallo,

du musst deine Struktur überdenken. Wieso soll ein untergeordnetes Element (hier das UserControl) wissen dürfen, was in der übergeordneten Klasse (dem Formular) vorgesehen ist? Wenn du das UserControl das nächste Mal in ein Formular ohne OpenFileDialog einfügst, kann es auch nicht funktionieren.

Merke: Ein Formular darf Zugriff auf untergeordnete Elemente haben, aber nicht umgekehrt. Nur was "gleichrangig" im Formular enthalten ist, kann unmittelbar miteinander kommunizieren und zusammenarbeiten.

Da ein Dialog sowieso nur temporäre Bedeutung hat, gehört er eher in das UserControl. Einheitliche Filter u.a. kannst du als Eigenschaft (oder über eine Methode) vom Formular an das UserControl übergeben. Aber was davon sinnvoll ist, hängt vom Gesamtaufbau ab.

Gruß Jürgen
bfmeb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: Mi 15.07.09 09:27 
Ok habe das jetzt nochmal überdacht. Eigentlich Quatsch das stimmt, habe mich nochmal informiert und bin jetzt zu folgendem Ansatz gekommen:

Habe jetzt in mein Control Eigenschaften erstellt. Dann eine neue Klasse erstellt und diese soll nun die Logik beinhalten:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
 public partial class ParameterControl : UserControl
    {
        public ParameterControl()
        {
            InitializeComponent();
        }

        public string Quelle
        {
            get { return textBoxXmlQuelle.Text; }
            set { textBoxXmlQuelle.Text = value; }
        }


        public string Ziel
        {
            get { return textBoxXmlZiel.Text; }
            set { textBoxXmlZiel.Text = value; }
        }

        public CheckBox Konvertiere
        {
            get { return checkBoxConvert; }
        }

        public Button buttonLoadXml
        {
            get { return LoadXml; }
        }


Das ist meine neue Klasse ParameterFunction.cs
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
  class ParameterFunction
    {
        ParameterControl p = new ParameterControl();
       //-->Events hier

        private void LoadXml_Click_1(object sender, EventArgs e)
        {
            p.openFileDialogXml.ShowDialog();
        }
    }


Meine Frage nun, wie kann ich jetzt meine ganzen Events dem Control zuweisen?
Wenn ich mein OpenFileDialog jetzt öffnen will passiert nichts, stimmt die Zuweisung noch nicht? Ich brauche einen Ansatz um die Logik dahinter zu verstehen...sonst wird das nix.

Wäre sehr dankbar über Antworten und vor allem Hilfe..
Gruß
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 15.07.09 11:01 
user profile iconbfmeb hat folgendes geschrieben Zum zitierten Posting springen:
Habe jetzt in mein Control Eigenschaften erstellt. Dann eine neue Klasse erstellt und diese soll nun die Logik beinhalten:
Ich denke nicht, dass das Sinn macht. UserControl und Form sollten zwar getrennt sein, aber für die Logik des UCs brauchst du keine separate Klasse.

_________________
>λ=
bfmeb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: Mi 15.07.09 11:05 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconbfmeb hat folgendes geschrieben Zum zitierten Posting springen:
Habe jetzt in mein Control Eigenschaften erstellt. Dann eine neue Klasse erstellt und diese soll nun die Logik beinhalten:
Ich denke nicht, dass das Sinn macht. UserControl und Form sollten zwar getrennt sein, aber für die Logik des UCs brauchst du keine separate Klasse.


Ich möchte aber gern Logik von der UI trennen, wenn ich die Logik in die Control KLasse schreibe da kann ich doch den Code gleich in die Main Form schreiben, richtig?

Also hätte ich ja wieder keine Trennung von Logik und GUI.
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 15.07.09 12:05 
Du verwechselst da zwei Dinge: UserControls dienen dazu, Teile der UI auszugliedern - meist, um sie an mehreren Orten wiederzuverwenden. Mit Trennung UI-Logik hat das nichts zu tun.
UI-Logik zusätzlich trennen zu wollen, ist natürlich nicht falsch, wenn auch in Winforms nicht gerade einfach. So wie du es machst, bringt es dir allerdings überhaupt nichts: Wo bleibt die Trennung, wenn du in der Logik direkt auf Controls zugreifst? Dein bisheriger Code könnte doch genauso gut so in ParameterControl.cs stehen, du hast nichts damit gewonnen.
Bei einer echten Trennung dürfte die View keine Controls nach außen hin präsentieren. Am besten hält man sich dafür an Design Patterns wie MVP.

_________________
>λ=