2013-07-01 2 views
1

Я играю вокруг abit с winforms и его элементами управления и только что открыл, как делать custommade buttonclicks. Однако есть проблема. У меня есть цикл, который перебирает список элементов, и если появляется условие - я создаю кнопку, которая выведет gridview.Захват правой кнопки события click

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; 
      } 
     } 
    } 

Это был мой метод для создания кнопок и события click для моего условия. Функция, которая передается EventHandler выглядит следующим образом:

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. В качестве примера : цикл создал для меня четыре кнопки, и они представлены на прямой линии на форме. Но всякий раз, когда я нажимаю одну из кнопок - dosnt matter, какая из них, кнопка всегда возвращает данные последней порожденной кнопки. Более яркий пример: позволяет сказать, что у нас есть список inputElems выглядит следующим образом:
inputElems [0] .Count -> 2644
inputElems [1] .Count -> 2131
inputElems [2] .Count -> 8467
inputElems [3] .Count -> 5462
Когда я сейчас нажимаю вторую кнопку, вход в список параметров вторых кнопок должен иметь значения (отправитель, e, 2131), правильно? но по какой-то причине последний аргумент получает то же, что и 4-й элемент в списке, хотя я вызываю вторую созданную кнопку.

Я полагал, что он имеет какое-то отношение ко мне, всегда вызывающее последнее добавленное button_click к обработчику события кнопки, если да, то как мне вызвать разные клики из EventHandler?

+0

Мне кажется, что проблема заключается в '' ctor' для DataGridForm', где этот код? –

+0

Проблема лежит в inputElems, не получая правильные значения, а не в datagrid –

+0

И что *** точно *** вы подразумеваете под этим? Это неправильная ценность? Если да, отредактируйте свой вопрос, какое значение вы получите, и какое значение вы ожидаете. Понимаете, такая информация действительно была бы полезной для решения проблемы. –

ответ

1

Вместо передачи входных данных с помощью EventHandler вы можете использовать тег.

E.g. Применение:

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(); 
} 
Смежные вопросы