2013-12-04 2 views
1

получаю сообщение об ошибке в следующей строке «this.dgvReport.Invoke (делегат»тип делегата не удается преобразовать анонимный метод

«Невозможно преобразовать анонимный метод типа„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; 
     }); 
    } 

ответ

8

Просто добавьте кастинг в какой-то тип делегата с той же подписью:

this.dgvReport.Invoke((MethodInvoker)(delegate { 
     this.dgvReport.DataSource = dtbl; 
})); 
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; }); 

также рассмотреть вопрос об использовании лямбда-выражения:

dgvReport.InvokeAction(() => dgvReport.DataSource = dtbl); 
Смежные вопросы