2016-10-29 14 views
0

現在、WinFormsミュージックプレーヤーを設計しています。ボタンループ内でControls.Add(new button(){})を使用するときのボタンの動作方法を設定する方法

Controls.Add(new Button(){}) 

私は現在使用しているコードを介して作成されたときにボタンがその内部whileループは、ボタン名を作成するためのコードがされてい+ Xここで、xの終わりにインクリメント値でありますループ。私がしたいのは、クリックするとボタンが "mpPlay"という名前の音楽を再生する機能を実行するように設定することです。これについて最善の方法は何でしょうか?あなたはgitリポジトリhereをダウンロードすることができ、ソースコードを見たい場合は

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++; 
} 

はここで私が使用している現在のコードです。

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

あなたはこのように呼び出します: - 多くのおかげで、ロス [EDIT]ここ

は、あなたがこのような単純なヘルパーメソッドを持つことができ

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

あなたのボタンは、そのパネルにはかなり座っ以外は、行いません。あなたはできるだけそのボタンを強く叩くことができますが、Clickイベントハンドラなしでは何も起こりません。 Buttonから独自のクラスを派生させるのをためらってはいけません。何か便利なことをするためにOnClickをオーバーライドし、何か有用なことをするために必要なプロパティを追加してください。それはこのコードを1つのライナーに崩壊させます。 –

答えて

1

mpPlay()のコードです:

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

引数を使用してmpPlayを呼び出す場合は、yこのようにそれを呼び出すou'd:

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

こんにちは、私はvoidとしてmpPlayを使用し、プログラムを実行すると、voidをsystem.Actionに変換できないというエラーが返され、mpPlayをアクションとして使用すると、すべてのコードパスがエラーを返さないというエラーが表示されます。私はmpPlayに使用するコードを編集しました。どのようにこれを修正するための任意のアイデア?多くのありがとう - ロス –

+0

@RossUnhi​​llhill私は引数を使って 'mpPlay'をどのように呼び出すことができるかの例を追加しました。 – germi

+0

もう一度、残念ながら私はまだボタンが作成されたときにボタンがグレーアウトされているように、Enabled = trueをcontrols.addに追加しても無効にした場合のようにグレーアウトされています。 AttachMethodToButtonのオブジェクトとイベントは、私のプログラムの中で別のものに置き換えられますか?申し訳ありませんが、これは本当に簡単な修正や愚かな質問ですが、私はVisualStudioのnew'ishです。ありがとう - ロス –

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++; 
} 
関連する問題