Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: Klasse wählen deren Titel mit einem String übereinstimmt, aber wie?

  1. #1
    Registriert seit
    01.09.2011
    Beiträge
    73
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Frage


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hi ihr,
    ich habe mal wieder ein neues Problem in der C#-Programmierung, aber vielleicht habt ihr ja eine Idee und könnt mir helfen...

    Und zwar habe ich 7 UserControls welche vom Titel bzw. von der Klassenbezeichnung her ähnlich sind, und zwar fangen alle mit "Adapterplatte_" an.
    Nun soll in einem Panel je nach dem was in einer Textbox eingegeben wird die entsprechende Adapterplatte gewählt wird.
    Ich habe es bisher so realisiert, dass ich den Text auf mit if Schleifen Abfrage und je nach dem was die Übereinstimmung ergibt die entsprechende Adapterplatte gewählt wird.
    Da aber im laufe der Zeit noch weitere Adapterplatten hinzukommen können, wäre eine Schleifenabfrage durchaus übersichtlicher und schöner.
    Ich weiß jedoch leider nicht ob dies überhaupt so zu realisieren ist.

    Bisheriger Code:

    string Adapterplatte=Textbox.Text;
    Adapterplatte_MV15 Adapterplatte_MV15_1, Adapterplatte_MV15_2;
    Adapterplatte_MV15_Siemens Adapterplatte_MV_Siemens_1, Adapterplatte_MV_Siemens_2;

    if (Adapterplatte=="Adapterplatte_MV15")
    {
    Adapterplatte_MV15_1=new Adapterplatte_MV15();
    panel_Prüfplatte1.Controls.Add(Adapterplatte_MV15_1);
    Adapterplatte_MV15_2=new Adapterplatte_MV15();
    panel_Prüfplatte2.Controls.Add(Adapterplatte_MV15_2 );
    }

    if (Adapterplatte=="Adapterplatte_MV15_Siemens")
    {
    Adapterplatte_MV_Siemens_1=new Adapterplatte_MV15_Siemens();
    panel_Prüfplatte1.Controls.Add(Adapterplatte_MV_Siemens_1);
    Adapterplatte_MV_Siemens_2=new Adapterplatte_MV15_Siemens();
    panel_Prüfplatte2.Controls.Add(Adapterplatte_MV_Siemens_2 );
    }

    Und so weiter für die restlichen 5 oder 6 Prüfplatten eben auch so.

    Ich habe mir eben so was vorgestellt wie

    String Test = Adapterplatte.Replace(" ","_") + _1;

    somit wäre dies die Bezeichnung der Klasse welche ich so benannt habe. Und ich könnte eine automatische Auswahl treffen


    Gruß Benni
    Zitieren Zitieren Klasse wählen deren Titel mit einem String übereinstimmt, aber wie?  

  2. #2
    Registriert seit
    19.12.2008
    Beiträge
    336
    Danke
    19
    Erhielt 28 Danke für 28 Beiträge

    Standard

    Du könntest alle möglichen und vorhandenen Adapterplatten in eine Collection einfügen und die dann nach dem entsprechenden Element durchsuchen - ich könnte mir vorstellen, dass das so funktionieren könnte.

  3. #3
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.745
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Ich würde alle Adapterplatten von einem gemeinsamen Interface ableiter. Dann statts einer Textbox eine Combobox benutzen, in der alle in der Assembly vorhanden Klassen, welche von dem Interface ableiten gelistet werden (per Reflection, und vieleicht jeder Klasse noch ein Description Attribut zuordnen, für den Text in der Listbox. Mit einem button, wird dann eine Instanz des ausgewählten Typs erzeugt und der Liste hinzugefügt!
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  4. #4
    Benni ist offline Benutzer
    Themenstarter
    Registriert seit
    01.09.2011
    Beiträge
    73
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hey ihr zwei, schon mal danke für eure Antworten,

    @Lupo, was genau verstehst du unter einer Collection? Sorry, bin erst seit August in der C#-Programmierung tätig und habe von diesem Begriff leider noch nichts gehört.

    @Jochen Kühner, also das mit der Textbox bzw. einer Variablen string muss fast sein, da ich diese Anhand von einer Artikelnummer befülle, es ist so dass wir in einer Liste verschiedene Artikelnummern haben, welche je nach dem eine bestimmte Ventilart sind und dementsprechend auf eine bestimmte Adapterplatte müssen... Diese Artikelnummern werden von einer Datei eingelesen und je nach dem welche gewählt wird, wird dann anhand des in der Datei stehenden Typs die entsprechende Adapterplatte in der Textbox bzw. Variablen angezeigt, sprich also die Adapterplatte ist abhängig von der eingegebenen Artikelnummer und wird nicht selbst direkt gewählt, also kann ich das eher nicht mit einer ComboBox realisieren... kannst du mir dennoch vielleicht ein paar Begriffe wie Reflection und so erklären und wo setzt man ein Description Attribut Kann ich dieses dann auch abfragen was hier drin steht und vergleichen o.ä.?

    Danke Euch beiden Vielmals
    Gruß Benni

  5. #5
    Benni ist offline Benutzer
    Themenstarter
    Registriert seit
    01.09.2011
    Beiträge
    73
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard

    @ Lupo, also ich habe mich mal mit den Collections auseinandergesetzt.
    Für die UserControls müsste ich ja dann also die ControlCollection verwenden das sehe ich doch richtig so oder?
    Aber bei der deklaration muss ich ja die Üergeordnete Form angeben, nun habe ich hier aber das nächste Problem... Und zwar habe ich die UserControls mit dem ProjektmappenEditor dem Projekt hinzugefügt und somit besteht kein übergeordnetes Form, wie muss ich dies dann handhaben?


  6. #6
    Registriert seit
    26.04.2010
    Ort
    Fürth
    Beiträge
    10
    Danke
    1
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Wenn du die UserControls im ProjektMappenEditor hast musst du nur noch eine Referenz auf dein jetziges Projekt einfügen.

    Jetzt kannst du die Controls mithilfe von "virtuellen" instanzen in eine neue ControlCollection packen und dann mit einer Schleife durchlaufen.

    Anstatt der von mir verwendeten Controls (Button, Label,...) kannst du auch deine Usercontrols verwenden.
    Code:
                String testString = "Button"; // String in der Textbox
    
                // UserControls 
                PictureBox ctl1 = new PictureBox();
                Button ctl2 = new Button();
                Label ctl3 = new Label();
    
                // Neue ControlCollection
                ControlCollection ctls = new ControlCollection(new Form());
                ctls.Add(ctl1);
                ctls.Add(ctl2);
                ctls.Add(ctl3);
    
    
                // Checkroutine
                String ctlName = "";
                foreach (Control ctl in ctls)
                {
                    ctlName = ctl.GetType().Name;
    
                    if (ctlName == testString)
                    {
                        ctl.Height = panel1.Height;
                        ctl.Width = panel1.Width;
                        
                        panel1.Controls.Add(ctl);
                    }
    
                }
    Mit freundlichem Gruß

    Manuel König

  7. #7
    Benni ist offline Benutzer
    Themenstarter
    Registriert seit
    01.09.2011
    Beiträge
    73
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo Manuel,
    Danke für deinen Beitrag,
    was verstehst du unter einer Referenz auf mein jetziges Projekt?
    Kanns du mir das bitte kurz erläutern?

  8. #8
    Registriert seit
    26.04.2010
    Ort
    Fürth
    Beiträge
    10
    Danke
    1
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Ich hab mal kurz ein kleines Video gemacht. Das erklärt es vielleicht.
    Hoffe du kannst es bei dir anschauen (am besten mit VLC).

    SelectByClassName.zip
    Mit freundlichem Gruß

    Manuel König

  9. #9
    Benni ist offline Benutzer
    Themenstarter
    Registriert seit
    01.09.2011
    Beiträge
    73
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ne, leider kann ich diese net öffnen.
    Naja aber ich hab es glaub ich hin bekommen... Aber kann ich danach auch irgendwie Variablen setzen, die in den einzelnen Klassen sind? Z.B. eine Artikelnummer oder so...

    Pruefplatte_MV15_1 = new Adapterplatte_MV15();
    Pruefplatte_MV15_2 = new Adapterplatte_MV15();
    Pruefplatte_MV15_Siemens_1 = new Adapterplatte_MV15_Siemens();

    ControlCollection Adapterplattensammlung = new ControlCollection(new Form());

    Adapterplattensammlung.Add(Pruefplatte_MV15_1);
    Adapterplattensammlung.Add(Pruefplatte_MV15_2);
    Adapterplattensammlung.Add(Pruefplatte_MV15_Siemens_1);


    foreach (Control ctl in Adapterplattensammlung)
    {
    Adapterplatte = Adapterplatte.Replace(" ", "_");
    if (Adapterplatte == ctl.GetType().Name)
    {
    ctl.Artikelnummer = Artikelnummer;
    panel_Pruefplatte1.Controls.Add(ctl);
    }
    }


    Das in Rot geschriebende würde ich gerne dann im nachhinein setzen... Damit ich die Collection gleich zu Beginn meines Codes setzen kann...

  10. #10
    Registriert seit
    26.04.2010
    Ort
    Fürth
    Beiträge
    10
    Danke
    1
    Erhielt 2 Danke für 2 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ja du kannst diese Werte auch im nachhinein ändern.

    Du musst allerdings wissen wie die Eigenschaft heißt die du ändern möchtest.
    Bspw. bei einem Button möchtest du die Beschriftung setzen, somit brauchst du die Eigenschaft "Text".

    Das sieht dann folgendermaßen aus.
    Code:
     // Checkroutine
                String ctlName = "";
                foreach (Control ctl in ctls)
                {
                    ctlName = ctl.GetType().Name;
    
                    if (ctlName == testString)
                    {
                        // Eigenschaft des Controls holen
                        PropertyInfo pi = ctl.GetType().GetProperty("Text");
    
                        // Neuen Wert setzen
                        pi.SetValue(ctl, "Testme", null);
                     
                        
                        ctl.Height = panel1.Height;
                        ctl.Width = panel1.Width;
                        
                        panel1.Controls.Add(ctl);
                    }
    
                }
    Mit freundlichem Gruß

    Manuel König

Ähnliche Themen

  1. SCL zwei INT aus einem STRING
    Von Uli_87 im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 24.02.2009, 10:33
  2. Antworten: 0
    Letzter Beitrag: 20.11.2008, 11:06
  3. Antworten: 0
    Letzter Beitrag: 11.08.2008, 14:40
  4. String laden und in einem DB Schreiben
    Von free_tv im Forum Simatic
    Antworten: 14
    Letzter Beitrag: 13.05.2006, 16:41
  5. Titel VBA und Libnodave etwas langsam?
    Von lorenz2512 im Forum Hochsprachen - OPC
    Antworten: 3
    Letzter Beitrag: 27.10.2005, 21:43

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •