Autor |
Beitrag |
bfmeb
      
Beiträge: 28
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mo 13.07.09 13:44
Hi!
Was meinst Du mit "hinter die Panels hauen"?
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 
      
Beiträge: 28
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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 
      
Beiträge: 28
|
Verfasst: Mo 13.07.09 14:33
ParameterControl.cs (Panel 1)
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 
      
Beiträge: 28
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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 
      
Beiträge: 28
|
Verfasst: 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.
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.
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(); 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 
      
Beiträge: 28
|
Verfasst: 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
      
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
|
Verfasst: 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 
      
Beiträge: 28
|
Verfasst: 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:
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
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| class ParameterFunction { ParameterControl p = new ParameterControl(); 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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Mi 15.07.09 11:01
bfmeb hat folgendes geschrieben : | 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 
      
Beiträge: 28
|
Verfasst: Mi 15.07.09 11:05
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: 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.
_________________ >λ=
|
|