2011-01-25 4 views
2

특정 이벤트에서 팝업되는 양식이 있습니다. 배열의 버튼을 끌어 태그 값을 특정 값으로 설정합니다. 따라서이 버튼을 누르거나 클릭하면 함수는 태그 값을 반환해야합니다.누름 단추에서 반환 값 가져 오기

어떻게하면됩니까? 그리고 어떤 버튼을 클릭했는지 어떻게 알 수 있습니까? 이 코드는 DialogResult를 반환하지만 함수에서 Tag 값을 반환하려고합니다. 어떻게하면 코드를 수정할 수 있습니까?

public static DialogResult SelectBox(string title, string[] btnArray, string[] btnValueArray) 
{ 
    Form form = new Form(); 

    Button[] buttonArray; 
    buttonArray = new Button[5]; 

    form.Text = title; 

    for (int i = 0; i < btnArray.Length; i++) 
    { 
     buttonArray[i] = new Button(); 
     buttonArray[i].Text = btnArray[i]; 
     buttonArray[i].Tag = new int(); 
     buttonArray[i].Tag = btnValueArray[i]; 

     buttonArray[i].TabStop = false; 
     buttonArray[i].Location = new System.Drawing.Point(0, i * 40); 
     buttonArray[i].Size = new System.Drawing.Size(240, 40); 
    } 

    form.ClientSize = new Size(240, 268); 
    form.Controls.AddRange(new Control[] { buttonArray[0], buttonArray[1], buttonArray[2] }); 
    form.FormBorderStyle = FormBorderStyle.FixedDialog; 
    form.StartPosition = FormStartPosition.CenterScreen; 
    form.MinimizeBox = false; 
    form.MaximizeBox = false; 

    DialogResult dialogResult = form.ShowDialog(); 
    return dialogResult; 
} 

답변

7

양식에 개인 변수를 추가 :

private void Button_Click(object sender, EventArgs e) { 
    SelectedTag = ((Button)sender).Tag; 
} 

사용자가 만든 각 버튼에 대한 핸들러를 할당합니다 :

private object SelectedTag; 

이 버튼을 클릭 처리기를 추가

.. 
buttonArray[i].OnClick += form.Button_Click; 
.. 

정적 함수를 호출하면 대화 상자 대신 form.SelectedTag을 반환합니다.

2

모든 버튼에 대해 동일한 클릭 이벤트를 호출 할 수 있습니다. 다음 핸들러 :

private void ButtonClick(object sender, EventArgs args) 
{ 
    Button oButton = (Button) sender; 

    object data = oButton.Tag; 
} 
0

DialogResult 속성은 이미 어떤 버튼이 클릭되었는지 알려줍니다. 각각의 개별 단추를 다른 DialogResult을 반환하도록 설정할 수 있습니다. 그런 다음 기능 맨 아래에서 확인하십시오. 당신이 클릭 버튼의 Tag 재산을 반환 할 경우

는 대신 있습니다 (Tag 속성 유형 Object의 때문에) Object에 함수의 반환 값을 변경해야합니다.

+1

버튼이 8 개 이상인 경우 어떻게됩니까? (DialogResult enum은 8 가지 값을 가질 수 있습니다.) –

+0

@ 오스카 : 예, 그렇다면 좀 더 작업해야합니다. 드물게 (있는 경우) 양식에 8 개 이상의 단추가 있어야합니다. –

+0

Microsoft Outlook을 열고 도구> 옵션으로 이동하면 첫 번째 탭에서만 표시됩니다. –

0

ButtonClick 이벤트 처리기를 TestForm에 추가하고 단추의 태그를 Form의 태그로 설정할 수 있습니다. 다음은 샘플입니다.

홈페이지 형태 :

public partial class TestForm : Form 
    { 
     public TestForm() 
     { 
      InitializeComponent(); 
     }  

     public void HandleOnButtonClick(Object sender, EventArgs e) 
     { 
      Button button = sender as Button; 

      if (button != null) 
       this.Tag = button.Tag; 
     } 
    } 

편집 : 당신은 모든 버튼의 값을 캡처하려면

다음 Dictionary<String, Object> 노출 그 예를 우리는 선택 박스 대화 상자에서 생성

 private void Form1_Load(object sender, EventArgs e) 
     { 
      Object tag; 
      SelectBox("test", new String[] { "One", "Two", "Three" }, new String[] {"one value", "Two value", "three value" }, out tag); 
      MessageBox.Show(tag.ToString()); 
     } 

     public static DialogResult SelectBox(string title, string[] btnArray, string[] btnValueArray, out Object tagValue) 
     { 
      TestForm form = new TestForm(); 

      Button[] buttonArray; 
      buttonArray = new Button[5]; 

      form.Text = title; 

      for (int i = 0; i < btnArray.Length; i++) 
      { 
       buttonArray[i] = new Button(); 
       buttonArray[i].Text = btnArray[i]; 
       buttonArray[i].Tag = new int(); 
       buttonArray[i].Tag = btnValueArray[i]; 

       buttonArray[i].TabStop = false; 
       buttonArray[i].Location = new System.Drawing.Point(0, i * 40); 
       buttonArray[i].Size = new System.Drawing.Size(240, 40); 
       // subscribe to button click event.. 
       // the handler is in TestForm 
       buttonArray[i].Click += form.HandleOnButtonClick; 
      } 

      form.ClientSize = new Size(240, 268); 
      form.Controls.AddRange(new Control[] { buttonArray[0], buttonArray[1], buttonArray[2] }); 
      form.FormBorderStyle = FormBorderStyle.FixedDialog; 
      form.StartPosition = FormStartPosition.CenterScreen; 
      form.MinimizeBox = false; 
      form.MaximizeBox = false; 

      DialogResult dialogResult = form.ShowDialog(); 
      // set the out args value 
      tagValue = form.Tag; 

      return dialogResult; 
     } 

TestForm 태그 속성

관련 문제