Без перегрузки для dateTimePicker1_ValueChanged соответствует делегат System.EventHandler - PullRequest
0 голосов
/ 24 января 2012
private void dateTimePicker1_ValueChanged(object sender, Series myseries, int multiplier, EventArgs e)
{
  if (datelimitsset == 1) {
    var dt1 = dateTimePicker1.Value;
    chart1.Series.Clear();

    for (int i = 0; i < multiplier; i++)
    {
      config();
      myseries.Points.AddXY(Convert.ToString(date[i]), Convert.ToDouble(array[i]));
      string[] rowi = { Convert.ToString(date[i]), Convert.ToString(array[i]) };
      dataGridView1.Rows.Add(rowi);
    }
  }
}

Это дает мне ошибку:

Нет перегрузки для 'dateTimePicker1_ValueChanged' соответствует делегату 'System.EventHandler'

Я не полностью понимаю событиеобработчики, кто-нибудь может дать мне совет?

Ответы [ 3 ]

2 голосов
/ 24 января 2012

Подпись для System.EventHandler равна (object sender, EventArgs e), поэтому вам нужно либо изменить подпись вашего метода следующим образом:

private void dateTimePicker1_ValueChanged(object sender, EventArgs e)

Или сохранить текущую подпись и использовать лямбда-выражение в качестве адаптера делегата, когда выподписаться на событие:

dateTimePicker1.ValueChanged += (object sender, EventArgs e) => 
 dateTimePicker1_ValueChanged(sender, [your Series variable], [your int multiplier variable], e);

Когда вы используете лямбда-выражение в качестве адаптера делегата, вы по сути создаете делегат, который соответствует подписи System.EventHandler (ему передаются object и EventArgs аргумент), который затем вызывает исходный метод-обработчик, передавая все аргументы, необходимые для удовлетворения вашего метода dateTimePicker1_ValueChanged.

Справочная документация для делегата System.EventHandler .

EDIT: документация для примера обработчика для DateTimePicker.ValueChanged событие

1 голос
/ 24 января 2012

Это потому, что ваш обработчик должен иметь ту же подпись, которая указана делегатом EventHandler.

То есть вам придется удалить два средних параметра:

private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
{
}

С точки зрения обходного пути для передачи этих параметров в функцию, у вас есть несколько вариантов ...

  1. Генерация обработчика событий как анонимной функции (согласно Джеймсу * * 1012)* answer )
  2. Сохранение и извлечение их из переменных экземпляра
  3. Сохранение их в свойстве Tag элемента управления DateTimePicker и разрешение их в обработчике

Второй вариант должен быть достаточно очевидным ...

Третий вариант может выглядеть следующим образом:

// In control initialization somewhere
dateTimePicker1.Tag = new DateTimePickerParams() { Series = myseries, Multiplier = multiplier }; // Where DateTimePickerParams is your own private class/struct defined explicitly for this purpose...

private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
{
    var ctl = sender as DateTimePicker;
    var parameters = ctl.Tag as DateTimePickerParams;

    var mySeries = parameters.Series;
    var multiplier = parameters.Multiplier;

    // Execute...
}
1 голос
/ 24 января 2012

Вы не можете добавлять произвольные параметры в обработчик событий подобным образом, сигнатура метода должна соответствовать делегату события.Как DateTimePicker узнает, что передать для параметров myseries и multiplier?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...