在以下行“this.dgvReport.Invoke(delegate”
)中收到错误“无法将匿名方法转换为'System.Delegate'类型,因为它不是委托类型”
public void FillProductGrid()
{
ProductSP productSP = new ProductSP();
DataTable dtbl = new DataTable();
string productname = "";
dtbl = productSP.StockReport(productname, this.cbxPrint.Checked);
this.dgvReport.Invoke(delegate
{
this.dgvReport.DataSource = dtbl;
});
}
答案 0 :(得分:8)
只需将转换添加到具有相同签名的某个委托类型:
this.dgvReport.Invoke((MethodInvoker)(delegate {
this.dgvReport.DataSource = dtbl;
}));
答案 1 :(得分:4)
Invoke
方法的参数类型为Delegate
,您只能将匿名函数转换为特定的委托类型。您需要转换表达式,或者(我的首选选项)使用单独的局部变量:
// Or MethodInvoker, or whatever delegate you want.
Action action = delegate { this.dgvReport.DataSource = dtbl; };
dgvReport.Invoke(action);
或者,您可以在Control
上创建一个特殊情况下的特殊委托的扩展方法,这可以使其更简单:
public static void InvokeAction(this Control control, Action action)
{
control.Invoke(action);
}
然后:
dgvReport.InvokeAction(delegate { dgvReport.DataSource = dtbl; });
还要考虑使用lambda表达式:
dgvReport.InvokeAction(() => dgvReport.DataSource = dtbl);