3

のみをWindows Form含む がありbuttonsます。New最終的な目標は、私が見た単純な論理ゲームを作成することですが、今のところ問題は、ボタンがクリックされたときにさまざまなアクションを実行したいということですが、現在buttonsはフォーム内のすべての一部であるため、彼に対してアクションが実行されることがありますあまりにも起こるべきではありません。明確にするために、2 つのスクリーンショットがあります。

ここに画像の説明を入力

だから、これが私が望む方法です-私はマトリックスを持っています-3x3(この場合、最後にそれが可能ですNxN)。クリックすることで、ボタンを赤くNewするなど、さまざまなことができるようにしたいと考えています。N今起こっていることは、New次のようにボタンを調べているため、ボタンもペイントされることがあります。

 foreach (Control c in this.Controls) 
                        {
                            if (c is Button)
                            {
                 ...

したがってNew、選択されることもあるので、最終的には次のようになります。

ここに画像の説明を入力

私が今考えているのは、コードで必要なときにいつでもチェックを実行し、Newボタンを明示的に除外することですが、これは良い方法ではないと思います。私のプログラムでは、この場合の正しい解決策は何ですか? コードが必要な場合は、お問い合わせください。

4

3 に答える 3

7

コントロールをループする代わりに、すべてのマトリックス ボタンをリストに追加し、newボタンを分離します。

private Button[] buttons;
private Button newButton;

これで、好きなだけボタンを追加できます。

for (int i = 0; i < 9; i++)
{
    buttons[i] = new Button();
    buttons[i].Text = "Button" + i;
    Controls.Add(buttons[i])
}

そして最後に、Newボタンがループしますbuttons:

private void newButton_Click(object sender, EventArgs e)
{
    foreach (Button b in buttons)
    {
        ...
    }
}
于 2013-01-27T17:50:08.310 に答える
7

おそらく最も簡単な解決策は、Grid を独自の Panel に配置することです ( pnlGrid)。そこにすべてのボタンを配置すると、代わりに次のことができます。

foreach (Control ctl in pnlGrid.Controls) { 
    if (ctl is Button) {
        // Do your logic here
    }
}
于 2013-01-27T17:51:01.010 に答える
0

ボタンクラスから継承できます。独自のボタンを作成し、このコントロール (親と同じ機能を持つ) をセットに使用し、コントロールを反復処理するときに確認します。

この目的のために Tag プロパティを使用することもできますが、継承はより明確になり、コードにセマンティックな意味が追加されると思います。

于 2013-01-27T17:49:49.073 に答える