2016-04-16 17 views
0

フォームのロードイベントで実行される次のコードがあります。行と列は可変であり、フォームがロードされるたびに異なる値を持つことができます。VB.NETで動的に生成されるボタンを無効にする

Dim XPos, YPos As Integer 
    Dim btn As Button 
    XPos = 80 
    YPos = 80 
    For i = 1 To row 
     XPos = 150 
     For j = 1 To column 
      btn = New Button 
      btn.Name = "btn" & i & j 
      btn.Size = New Drawing.Size(40, 40) 
      btn.Location = New Point(XPos, YPos) 
      Me.Controls.Add(btn) 
      XPos = XPos + btn.Width + 5 
     Next 
     YPos = YPos + btn.Height + 5 
    Next 

と仮定、行= 5と列= 5、出力は私がbtn32をクリックした場合、私は以下のようにだけその隣接するボタンをクリックすることができ、今

btn11 btn12 btn13 btn14 btn15 
btn21 btn22 btn23 btn24 btn25 
btn31 btn32 btn33 btn34 btn35 
btn41 btn42 btn43 btn44 btn45 
btn51 btn52 btn53 btn54 btn55 

のようになります、 btn21 btn22を、btn23、btn31、btn33、btn41、btn42、btn43と私はボタンの残りの部分をクリックすることはできません。

私が最初にbtn54をクリックすると、btn53、btn43、bt44mbtn45、btn55だけをクリックすることができます。残りのボタンをクリックすることはできません。

とボタンの残りの部分は同じスタイル(色、テキスト...など)に残ってしなければならない

ボタンのそれらの残りの部分を無効にする方法。ここで助けてください...

+1

最初にすべてのボタンを無効にしてから、クリックしたボタンの列と行を抽出します。その後、 'curC - 1、curR - 1'と' curC、curR - 1'と 'curC + 1、curR - 1'と' curC - 1、curR'と 'curC + 1 ' 、curR'などを有効にし、それらを有効にします( 'curC'は現在の列、' curR'は現在の行です)。 –

+0

左上のボタンは「現在の列-1、現在の行-1」の位置にあり、右下のボタンは「現在の列+1、現在の行+ 1」の位置にあります。 –

+0

どのようにコードを有効にできるのか教えていただけますか? –

答えて

1

Visual Vincentが提案したように、クリックされたボタンの行と列を抽出するのではなく、オブジェクト自体のプロパティに保存することができます。 次に、既に説明したように、Me.Controlsを繰り返して、ボタンであり、行と列のプロパティが有効になることを条件としないものをすべて無効にします。

Class GenBtn 
    Inherits Button 
    Private row, col As Integer 
    Public Function isAdjacent(ByRef Column As Integer, ByRef Row As Integer) 
     If Column < Me.col - 1 Or Column > Me.col + 1 Then 
      Return False 
     ElseIf Row < Me.row - 1 Or Row > Me.row + 1 Then 
      Return False 
     Else 
      Return True 
     End If 
    End Function 
End Class 

ヒント:グループのコントロールが簡単に誤ってメインの要素を無効にせずにのみ生成のコントロールを指すように。

+0

良い答え。しかし、それをループしないでください。それは、列と行がボタン名の中に格納されていると、CPUとメモリーの無駄です。 –

+1

また、範囲外であることを確認するのはなぜですか? 'Return(Column> = Me.col-1 AndAlso Column <= Me.col + 1 AndAlso Row> = Me.row - 1 AndAlso Row <= Me.row + 1)'が返されます。 –

+0

@VisualVincent私は同意します。この声明は、それを非常に小さくてスマートにします。名前と合計列で位置を計算するのではなく、継承にppintしたいだけです。 Yash Mehtaは今、彼のユースケースを検討すべきだと思います。 – Clijsters

関連する問題