2009-11-05 9 views
6

Winformsアプリケーションでボタンの配列を作成するにはどうすればよいですか?ボタンのC#配列を作成するにはどうすればよいですか?

私は何をしようとしています:これは、タイムスロットを示す一種のカレンダー配置で多くのボタンを持っています。 IE:Monday0700Button、Monday0730Button、Monday0800Buttonなど30分間隔で。

私はxmlデータベースを持っていますが、予定フィールドの1つは<Duration>です。duration = 0.5hrs、<Time>フィールドが "07:00 am"に等しい場合、 'Monday0700Button'に色付けします。 Durationが1.0hrsの場合、 'Monday0730Button'の次のタイムスロットボタンと同様に 'Monday0700Button'に値を設定します。

アイデア?おかげさまで

+3

質問に完全には関係しませんが、ちょっと先を見て、http://www.devexpressを見てみるとよいでしょう。カレンダープランナーとしてあなた自身を書くのではなく、もっと手間がかかります。 – RC1140

+0

+1 stalkerh:私たちはそのコントロールを使いますスイート)では、私は素晴らしい結果を出しています。十分にお勧めできませんでした。 –

答えて

5

はい、次のようなボタンのリストを作成できます。

List<Button> listOfButtons = new List<Button>(); 
listOfButtons.Add(yourButton); 
+1

あなたの答えは不完全かもしれないと思います。フォーム上にボタンを表示して使用できない限り、ボタンオブジェクトのリストは無用です。各ボタンにどのようにイベントを接続しますか? –

+0

@ Robert Harvey:この例では、プログラムでイベントハンドラを追加する必要があります。 – FrustratedWithFormsDesigner

+3

あなたは私のupvoteを得るためにそれよりもうまくやらなければなりません。 –

3

はい、ボタンやオブジェクトの配列を作成することは問題ありません。 ビジュアルスタジオデザイナーで見ることはできませんが、うまく動作します。

長年前、電卓アプリのUIを構築するために2次元のボタン配列を使用しました。私は長い間HP-15Cを使用していましたが、それを逃しました。

alt text

配列のアプローチがうまく働きました。

Button[] numberButtons=new Button[] { btn0, btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9, btnDecimalPt}; 
    Button[] operationButtons=new Button[] { btnDiv, btnMult, btnSubtract, btnAdd }; 

    foreach (var b in numberButtons) 
     b.Click += new System.EventHandler(this.Number_Click); 

    foreach (var b in operationButtons) 
     b.Click += new System.EventHandler(this.Operation_Click); 

    // etc 

    Button[][] allButtons= 
    { 
     new Button[] {btnSqrt, btnExp, btn10x, btnPow,btnMultInverse, btnCHS, null, null, null, null}, 
     new Button[] {btnN, btnInterest, btnPMT, btnPV, btnFV, null, btn7, btn8, btn9, btnDiv}, 
     new Button[] {btnLn, btnLog, btnSine, btnCosine, btnTangent, btnPi, btn4, btn5, btn6, btnMult}, 
     new Button[] {btnRoll, btnSwap, btnCLRfin, btnCLX, btnCLR, btnEnter, btn1, btn2, btn3, btnSubtract}, 
     new Button[] {btnInt, btnFrac, btnFix, btnStore, btnRecall, null, btn0, btnDecimalPt, btnNotUsed, btnAdd} 
    }; 

    // programmatically set the location 
    int col,row; 
    for(row=0; row < allButtons.Length; row++) 
    { 
     Button[] ButtonCol= allButtons[row]; 
     for (col=0; col < ButtonCol.Length; col++) 
     { 
      if (ButtonCol[col]!=null) 
      { 
       ButtonCol[col].TabIndex = col + (row * allButtons.Length) +1; 
       ButtonCol[col].Font = font1; 
       ButtonCol[col].BackColor = System.Drawing.SystemColors.ControlDark; 
       ButtonCol[col].Size=new System.Drawing.Size(stdButtonWidth, stdButtonHeight); 
       ButtonCol[col].Location=new Point(startX + (col * stdButtonWidth), 
               startY + (row * stdButtonHeight)) ; 
      } 
     } 
    } 
+0

これを実行すると、foreach(numberButtonsのvar b)に当たれば実行時エラーが発生します b.Click + = new System.EventHandler(this.Number_Click); – user1747567

0

ボタンは、すべてのGUI要素と同様に、他のものと同様のオブジェクトです(表示されることもあります)。そう、はい、配列、リスト、辞書を持つことができます。テイラーLのresponseにはいくつかのサンプルコードがあります。

0

はい、可能です.Taylor Lが実証しました。唯一の捉え方は、コントロールのコピーと貼り付けによって作成されたVB6スタイルのコントロール配列は、フォームエディタでもう実行できないということです。

3

確かに可能ですが、おそらく不要です。

私が正しく理解していれば、FlowLayoutPanelをフォームに追加し、XMLをループして、必要に応じて新しいButtonをインスタンス化することができます。 Clickイベントのイベントハンドラを配線し、FlowLayoutPanelのControlsプロパティからAdd()メソッドを呼び出して、FlowLayoutPanelにボタンを追加します。

while (reader.Reader()) 
{ 
    // Parse XML here 

    // Instantiate a new button that will be added to your FlowLayoutPanel 
    Button btn = new Button(); 

    // Set button properties, as necessary 
    btn.Text = "Foo"; 
    btn.Click += new EventHandler(SomeButton_Click); 

    // Add the button to the FlowLayoutPanel 
    flowLayoutPanel.Controls.Add(btn); 
} 

FlowLayoutPanelは、それが簡単にあなたのボタンのレイアウトを行うにはなりますが

は、それはあなたのために動作しない場合があります。その場合、XMLをループする際にボタンのX座標とY座標を調整する必要があります。

上記の方法で遭遇する問題の1つは、常に同じイベントハンドラを呼び出すことです。その結果、どのボタンがクリックされたかを判断する方法が必要になります。 1つのアプローチは、Buttonコントロールを拡張して、期間を確認するために使用できる追加のプロパティを提供することです。

関連する問題