“dateTimePicker1_ValueChanged”没有重载与委托“System.EventHandler”匹配

本文关键字:System 匹配 EventHandler dateTimePicker1 ValueChanged 重载 | 更新日期: 2023-09-27 18:21:08

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"匹配

我不完全了解事件处理程序,谁能给我建议?

“dateTimePicker1_ValueChanged”没有重载与委托“System.EventHandler”匹配

System.EventHandler的签名是(object sender, EventArgs e)的,因此您需要将方法签名更改为以下内容:

private void dateTimePicker1_ValueChanged(object sender, EventArgs e)

或者保留当前签名,并在订阅事件时使用 lambda 表达式作为委托适配器:

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

当您使用 lambda 表达式作为委托适配器时,您实际上是在创建一个符合System.EventHandler签名的委托(它传递了一个object和一个EventArgs参数(,然后调用您的原始处理程序方法,传递满足dateTimePicker1_ValueChanged方法所需的所有参数。

System.EventHandler 委托的参考文档。

编辑:DateTimePicker.ValueChanged 事件的示例处理程序的文档

这是因为处理程序必须具有EventHandler委托指定的相同签名。

也就是说,您必须删除两个中间参数:

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

就将这些参数传递到函数中的解决方法而言,您有几个选择......

  1. 将事件处理程序生成为匿名函数(根据 James 的答案(
  2. 从实例变量中存储和检索它们
  3. 将它们存储在 DateTimePicker 控件的 Tag 属性上,并在处理程序中解析它们

第二个选项应该足够明显...

第三个选项可能如下所示:

// 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...
}

不能像这样向事件处理程序添加任意参数,方法签名必须与事件委托匹配。DateTimePicker如何知道要传递哪些myseriesmultiplier参数?