2016-10-29 3 views
0

Ich entwerfe gerade einen WinForms-Musikplayer, und ich habe einige Probleme herauszufinden, was ich einstellen soll Taste funktioniert, wenn die Taste überMethode zum Festlegen der Funktionsweise einer Schaltfläche bei Verwendung von Controls.Add (neue Schaltfläche() {}) in einer Schleife

Controls.Add(new Button(){}) 

der Code ich benutze derzeit erstellt wird, ist eine while-Schleife, innerhalb dessen der Code eine Schaltfläche Namen erstellen + x, wobei x ein Wert, der am Ende Schritten die Schleife. Was ich tun möchte, ist es so einzustellen, dass beim Klicken auf die Schaltfläche die Funktion zum Abspielen von Musik mit dem Namen "mpPlay" ausgeführt wird. Was wäre der beste Weg, dies zu tun?

Hier ist der aktuelle Code Ich verwende:

while (trackNoReader.Read()) 
{ 
    flpTrackNo.Controls.Add(new Button() 
    { 
     Name = "btnTrackNo" + x, 
     Text = trackNoReader[0] as string, 
     BackColor = Color.Transparent, 
     FlatStyle = FlatStyle.Flat, 
     AutoSize = false, 
     Dock = DockStyle.Top, 
     Width = flpArtist.Width, 
     ForeColor = ColorTranslator.FromHtml("#444444"), 
     Font = new Font("Trebuchet MS", 9), 
     Enabled = true, 
     TextAlign = ContentAlignment.MiddleLeft, 
     FlatAppearance = 
     { 
      BorderSize = 0 
     }, 
    }); 

    x++; 
} 

Wenn Sie den Quellcode sehen möchten, können Sie das Git Repository here herunterladen. Vielen Dank - Ross [EDIT]

Hier ist der Code für mpPlay()

public void mpPlay(int x, string Column) 
    { 
     MySqlCommand selectPath = new MySqlCommand("SELECT" + Column + "FROM Music WHERE TrackNo=" + x); 
     selectPath.Connection = DB.connect; 
     MySqlDataReader readerPath = selectPath.ExecuteReader(); 
     while (readerPath.Read()) 
     { 
      path = readerPath[0] as string; 
      path = path.Replace("\"", "\\"); 
     } 
     mpPlayer.Open(path); 
     mpPlayer.Play(); 
    } 
+0

Ihre Taste nichts tut, außer hübsch in diesem Panel sitzt. Sie können diesen Button so hart wie möglich knallen, aber ohne einen Click-Event-Handler wird nichts passieren. Zögere nie, deine eigene Klasse von Button abzuleiten, überschreibe OnClick, um etwas Nützliches zu tun und füge alle Eigenschaften hinzu, die du brauchst, um etwas Nützliches zu tun. Das kollabiert diesen Code zu einem Einzeiler. –

Antwort

1

Sie eine einfache Hilfsmethode wie diese haben könnte:

public Button AttachMethodToButton(Button b, Action buttonMethod) 
{ 
    b.Click += (s, e) => buttonMethod(); 
    return b; 
} 

, die Sie nennen würde wie folgt aus:

flpTrackNo.Controls.Add(AttachMethodToButton(new Button() 
    { 
     // ... button properties like you already have 
    }, 
    mpPlay)); // I'm assuming 'mpPlay' is a void method 

Wenn Sie mpPlay mit Argumenten nennen, y ou'd es so nennen:

flpTrackNo.Controls.Add(AttachMethodToButton(new Button() 
    { 
     // ... button properties like you already have 
    }, 
    () => mpPlay(intParam, stringParam))); // replace intParam and stringParam with whatever arguments you want here 
+0

Hallo, wenn ich MPPlay als void verwenden und das Programm ausführen, gibt es einen Fehler zurück, der void nicht in system.Action konvertieren kann, und wenn ich MPPlay als eine Aktion verwende, bekomme ich einen Fehler, der besagt, dass nicht alle Codepfade einen Fehler zurückgeben. Ich habe eine Bearbeitung mit dem Code, den ich für MPPlay verwende. Irgendwelche Ideen, wie das zu beheben ist? Vielen Dank - Ross –

+0

@RossUnderhill Ich habe ein Beispiel hinzugefügt, wie Sie 'mpPlay' mit Argumenten aufrufen können. – germi

+0

Hi, leider kann ich das immer noch nicht zum Laufen bringen, wenn die Schaltfläche erstellt wird, ist die Schaltfläche ausgegraut, als ob sie deaktiviert wäre, wenn sie Enabled = true, aber zu controls.add noch nicht aktiviert. Sollte das Objekt s und eventarg e in AttachMethodToButton durch etwas anderes in meinem Programm ersetzt werden. Tut mir leid, wenn das eine wirklich einfache Lösung ist und/oder eine blöde Frage, die ich VisualStudio gegenüber neu bin. Danke - Ross –

0
while (trackNoReader.Read()) 
{ 
    flpTrackNo.Controls.Add(new Button() 
    { 
     Name = "btnTrackNo" + x, 
     Text = trackNoReader[0] as string, 
     BackColor = Color.Transparent, 
     FlatStyle = FlatStyle.Flat, 
     AutoSize = false, 
     Dock = DockStyle.Top, 
     Width = flpArtist.Width, 
     ForeColor = ColorTranslator.FromHtml("#444444"), 
     Font = new Font("Trebuchet MS", 9), 
     Enabled = true, 
     TextAlign = ContentAlignment.MiddleLeft, 
     FlatAppearance = 
     { 
      BorderSize = 0 
     }, 
    }); 

    // Adds Click event handler to last added button 
    flpTrackNo.Controls[flpTrackNo.Controls.Count - 1].Click += (sender, args) => 
    { 
     // Call the function to play a sound 

     // Additionally the sender gives you the specific button as object 
    }; 

    x++; 
} 
Verwandte Themen