2009-11-05 10 views
6

Winforms 응용 프로그램에서 단추 배열을 어떻게 작성합니까?어떻게 C# 배열 버튼을 만들 수 있습니까?

내가하려고하는 일은 다음과 같습니다. 일종의 일정 배열로 많은 시간을 나타내는 버튼이 있습니다. IE : Monday0700Button, Monday0730Button, Monday0800Button 등. 30 분 간격으로 계속됩니다.

약속 필드 중 하나가 <Duration> 인 xml 데이터베이스가 있습니다. 기간이 0.5 시간이고 <Time> 필드가 "07:00 am"인 경우 'Monday0700Button'의 색을 지정하십시오. Duration이 1.0hrs 일 때 'Monday0730Button'의 다음 타임 슬롯 버튼뿐만 아니라 'Monday0700Button'을 채우고 싶습니다.

아이디어가 있으십니까? 감사합니다. .

+3

질문과는 완전히 관련이 없지만 조금만 앞을 내다 보시면 http : //www.devexpress를보실 수 있습니다.com/Products/NET/Controls/WinForms/Scheduler /는 자신의 글을 작성하는 대신 달력 플래너로 사용하기 때문에 적은 노력으로 더 많은 것을 얻을 수 있습니다. – RC1140

+0

+1 스토커 : 스위트) 어디서 좋은 결과를 얻을 수 있습니다. 충분히 추천 할 수 없었습니다. –

답변

5

예, 다음과 같은 버튼 목록을 작성할 수 있습니다.

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

귀하의 답변이 불완전하다고 생각합니다. 폼에 버튼을 표시하고 사용할 수 없다면 버튼 객체 목록은 쓸모가 없습니다. 각 버튼에 이벤트를 연결하는 방법은 무엇입니까? –

+0

@Robert Harvey :이 예제에서 프로그래밍 방식으로 이벤트 처리기를 추가해야합니다. – FrustratedWithFormsDesigner

+3

내 upvote를 얻으려면 그보다 더 잘해야합니다. –

3

예, 버튼 또는 객체의 배열을 만드는 것은 문제가되지 않습니다. Visual Studio 디자이너에서는 볼 수 없지만 정상적으로 작동합니다.

오래전에 나는 계산기 응용 프로그램을위한 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() 메서드를 호출하여 Button을 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 좌표를 계산해야합니다.

위의 방법으로 발생하는 한 가지 문제점은 항상 정확히 동일한 이벤트 처리기를 호출한다는 것입니다. 결과적으로 클릭 한 버튼을 확인하는 방법을 찾아야합니다. 한 가지 방법은 Button 컨트롤을 확장하여 기간을 확인하는 데 사용할 수있는 추가 속성을 제공하는 것입니다.

관련 문제