none
Textbox als Parameter übergeben

    Frage

  • Hallo

    ich habe in einem Project mehrere Dateipfade zum auslesen. Die Dateinamen werden in verschiedenen List-Boxen in einer Windows-Form angezeigt. Derzeit habe ich 3 List-Boxen, muss diese aber um mehrere erweitern. 

    um den Code zu vereinfachen, wollte ich nur noch 1 Methode für das auslesen verwenden. (Derzeit wird dies für jede List-Box einzeln erledigt)

    Das sieht so aus:

     private void getLive(string filter = "*")
            {
                lb_life.Items.Clear();
                lbl7.Text = "lese Dateien";
                
                try
                {
                    foreach (string fileName in System.IO.Directory.GetFiles(prodLivePath,filter))
                    {
                        lb_life.Items.Add(fileName);
    
                        if (filter != "*")
                            lb_life.SetSelected(lb_life.Items.IndexOf(fileName), true);
                    }
                    DirectoryInfo di1 = new DirectoryInfo(prodLivePath);
                    lbl7.Text = di1.GetFiles().Length + " Dateien";
                }
                catch
                {
                    MessageBox.Show("Fehler beim einlesen von Pfad xyz.");
                    lbl7.Text = "Fehler";
                }
            }

    nun möchte ich in hieraus eine allgemeine Methode für mehrere List-Boxen gestalten. Dazu müsste ich die Namen der List-Boxen / Labels als Parameter übergeben. Jedoch bin ich daran gescheitert. Scheinbar kann ich keine Namen der Steuerelemente übergeben und in der Methode dann auf die Member zugreifen. in dem Beispiel oben wäre das lbl7 und lb_live.

    wie kann ich die Namen übergeben, damit ich dann universell die Items mit der Methode in die Boxen schreiben kann?

    Danke für euere Hilfe

      

    SisualStudio express 2012 C#

    Montag, 17. Februar 2014 08:09

Antworten

  • Hallo,
    ich würde an deiner Stelle nicht die Namen der Obekte, sondern die Objekte selbst übergeben. Dein Methodenkopf kölnnte dann so aussehen:

    private void getLive(Label lbl, Label lbLive, string filter = "*")

    In deiner Methode kannst du dann wie gewohnt auf die Eigenschaften zugreifen (Beispiel: lbl.Text = "Test").

    Zum aufrufen musst du dann nurnoch die Objekte übergeben:

    getLive(lbl7, lb_Live, "FILTER");

    Hinweis: Auch wenn deine Controls exakt die gleichen namen haben, wie die Parameter der Methode, macht das keine Probleme. Beim zugreifen wird dann der Parameter der Methode verwendet, nicht das Control der Klasse. Um das zu ändern musst du das this-Schlüsselwort benutzen (Beispiel: this.lbl7).

    PS: Scheinbar falsches Forum ;)
    VB.NET und C# uznterscheiden sich zwar fast nur in der Syntax, aber auch das ist ein unterschied.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.


    • Bearbeitet KoopakillerMVP Montag, 17. Februar 2014 08:46 PS
    • Als Antwort markiert kudlmudl Montag, 17. Februar 2014 09:49
    Montag, 17. Februar 2014 08:44

Alle Antworten

  • Hallo,
    ich würde an deiner Stelle nicht die Namen der Obekte, sondern die Objekte selbst übergeben. Dein Methodenkopf kölnnte dann so aussehen:

    private void getLive(Label lbl, Label lbLive, string filter = "*")

    In deiner Methode kannst du dann wie gewohnt auf die Eigenschaften zugreifen (Beispiel: lbl.Text = "Test").

    Zum aufrufen musst du dann nurnoch die Objekte übergeben:

    getLive(lbl7, lb_Live, "FILTER");

    Hinweis: Auch wenn deine Controls exakt die gleichen namen haben, wie die Parameter der Methode, macht das keine Probleme. Beim zugreifen wird dann der Parameter der Methode verwendet, nicht das Control der Klasse. Um das zu ändern musst du das this-Schlüsselwort benutzen (Beispiel: this.lbl7).

    PS: Scheinbar falsches Forum ;)
    VB.NET und C# uznterscheiden sich zwar fast nur in der Syntax, aber auch das ist ein unterschied.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.


    • Bearbeitet KoopakillerMVP Montag, 17. Februar 2014 08:46 PS
    • Als Antwort markiert kudlmudl Montag, 17. Februar 2014 09:49
    Montag, 17. Februar 2014 08:44
  • hallo koopakiller

    Danke für die schnelle Antwort!

    Mit dem Forum.Bereich passe ich das nächste mal besser auf :)

    das Schlüsselwort this muss dann im Methodenaufruf oder in der Methode selber verwendet werden?

    ich denke so oder?

    IOActions(ProdLivePath, this.lb_life, this.lbl7, filter)
    
    private void IOActions(string path, ListBox box, Label label, string filter = "*")
            {
                box.Items.Clear();
                label.Text = "lese Dateien";
                
                try
                {
                    foreach (string fileName in System.IO.Directory.GetFiles(path,filter))
                    {
                        box.Items.Add(fileName);
                        
                        if (filter != "*")
                            box.SetSelected(box.Items.IndexOf(fileName), true);
                    }
                    // DirectoryInfo di1 = new DirectoryInfo(prodLivePath);
                    // lbl7.Text = di1.GetFiles().Length + " Dateien";
                    label.Text = box.Items.Count.ToString();
                }
                catch
                {
                    MessageBox.Show("Fehler beim einlesen von xyz.");
                    label.Text = "Fehler";
                }
            }


    SisualStudio express 2012 C#

    Montag, 17. Februar 2014 09:28
  • Genau, denn beim Aufruf greifst du auf die Controls zu. In der Methode selbst nur auf die übergebenen Objekte.

    Das this-Schlüsselwort ist zwar keine Pflicht, solange die Controls nicht wie Variablen/Parameter heißen, erleichtert hier aber das Verstehen zwischen Control und Parameter.


    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Montag, 17. Februar 2014 09:43