2013-07-01 3 views
1

winforms 및 해당 컨트롤을 사용하여 abit을 재생하고 있으며 맞춤 버튼 클 릭을 수행하는 방법을 발견했습니다. 그러나 문제가 있습니다. 루프가있어 요소 목록을 반복하며 조건이 표시되면 gridview를 팝업하는 버튼을 만듭니다.오른쪽 버튼 클릭 이벤트 캡처

public void draw(ref Panel inputPanel) //draws the eventline 
    { 
     int stepCounter = 0; 
     for (int i = 0; i < DaysList.Count-1; i++) 
     { 
      Button b1; 
      if (DaysList[i].Elements.Count > max) 
      { 
       b1 = new Button(); //Create the box 
       b1.Width = 120; 
       b1.Height = 40; //Set width and height 
       b1.Location = new Point(stepCounter + 35, 70); //Location 
       inputPanel.Controls.Add(b1); // 
       b1.Text = "Check event date in grid"; 
       b1.Show(); 
       b1.BringToFront(); 
       b1.Click += new EventHandler((sender, e) => btn_Click(sender, e, DaysList[i].Elements)); 
       stepCounter += 200; 
      } 
     } 
    } 

내 조건이 표시 될 때까지 버튼과 클릭 이벤트를 생성하는 것은 제 방법이었습니다. 이벤트 핸들러에 전달되는 기능은 다음과 같습니다 : 이벤트의

public void btn_Click(object sender, EventArgs e, List<EventElement> inputElems) 
    { 
     Button button = sender as Button; 
     DataGridForm window = new DataGridForm(inputElems); 
     window.Show(); 
    } 

public class EventElement 
{ 
    public EventElement() 
    { 
    } 
    public int Count{get;set;} 
    public string Date{get;set;} 
} 

clickpart 괜찮습니다하지만 난이 산란 버튼을 클릭 할 때마다, 나는있는 gridview에 잘못된 데이터를 얻을. 예 : : 루프는 나를 위해 4 개의 버튼을 만들었으며 폼에 직선으로 표시됩니다. 그러나 내가 버튼 중 하나를 클릭 할 때마다 - 그들 중 어느 것이 든, 버튼은 항상 마지막으로 생성 된 버튼의 데이터를 반환합니다. 더 명확한 예 :이처럼 보이는 우리가 목록 inputElems이 있다고 할 수 있습니다 :
inputElems [0] .Count -> 2644
inputElems [1] .Count -> 2131
inputElems [2] .Count -> 8467
inputElems [3] .Count -> 5462
이제 두 번째 버튼을 클릭하면 두 번째 버튼 매개 변수 목록의 입력 값이 (송신자, e, 2131)이어야합니다. 맞습니까? 하지만 두 번째로 생성 된 버튼을 호출하더라도 몇 가지 이유로 마지막 인수는 목록의 네 번째 요소와 동일하게됩니다.

버튼의 이벤트 핸들러에 항상 마지막으로 추가 된 button_click을 호출하는 것과 관련이 있다고 생각했습니다. 그렇다면 어떻게하면 EventHandler에서 다른 클릭을 호출 할 수 있습니까?

+0

문제가 DataGridForm''에 대한'ctor'에 나에게 보인다, 그 코드는 어디에 있습니까? –

+0

문제는 inputElems에서 DataGrid가 아니라 올바른 값을 얻지 못하는 것입니다. –

+0

그리고 *** 정확히 *** 무엇을 의미합니까? 그것은 잘못된 가치입니까? 그렇다면 어떤 가치를 지니고 있는지, 어떤 가치를 기대하는지에 따라 질문을 편집하십시오. 그 종류의 정보가 실제로 문제를 해결하는 데 도움이 될 것입니다. –

답변

1

EventHandler와 함께 inputElems를 전달하는 대신 Tag를 사용할 수 있습니다.

예. 사용 : 당신의 클릭 이벤트 처리기에서 다음

b1.Tag=i; 

을 :

public void btn_Click(object sender, EventArgs e) 
    { 
     Button button = sender as Button; 
     DataGridForm window = new DataGridForm(DaysList[int.Parse(button.Tag.ToString())].Elements); 
     window.Show(); 
    } 
+0

그래, 그거야! –

1

문제는 for 루프 범위에서, 그리고 당신이 찾고있는 데이터를 제공하는 것이없는 것입니다. 더 정직 접근 방식이 같을 수 있습니다

public void draw(ref Panel inputPanel) //draws the eventline 
{ 
    int stepCounter = 0; 
    for (int i = 0; i < DaysList.Count-1; i++) 
    { 
     Button b1; 
     if (DaysList[i].Elements.Count > max) 
     { 
      b1 = new Button(); //Create the box 
      b1.Width = 120; 
      b1.Height = 40; //Set width and height 
      b1.Location = new Point(stepCounter + 35, 70); //Location 
      inputPanel.Controls.Add(b1); // 
      b1.Text = "Check event date in grid"; 
      b1.Show(); 
      b1.BringToFront(); 
      b1.Tag = DaysList[i].Elements; 
      b1.Click += btn_Click; 
      stepCounter += 200; 
     } 
    } 
} 

다음 btn_Click에서 다음을 수행하십시오

public void btn_Click(object sender, EventArgs e) 
{ 
    Button button = sender as Button; 
    int inputElems = (List<EventElement>)button.Tag; 
    DataGridForm window = new DataGridForm(inputElems); 
    window.Show(); 
} 
관련 문제