2012-01-30 81 views
4

我在運行異步的C++ .NET窗體應用程序中有背景工作。在這個backgroundworker的DoWork函數中,我想將行添加到datagridview中,但是我無法真正弄清楚如何使用BeginInvoke做到這一點,因爲我的代碼似乎沒有工作。使用BeginInvoke時參數計數不匹配異常

的代碼我有

delegate void invokeDelegate(array<String^>^row); 

.... 
In the DoWork of the backgroundworker 
.... 

array<String^>^row = gcnew array<String^>{"Test", "Test", "Test"}; 
if(ovlgrid->InvokeRequired) 
    ovlgrid->BeginInvoke(gcnew invokeDelegate(this, &Form1::AddRow), row); 

.... 

void AddRow(array<String^>^row) 
{ 
ovlgrid->Rows->Add(row); 
} 

我得到的錯誤是:

的類型 'System.Reflection.TargetParameterCountException' 未處理的異常出現在mscorlib.dll的

附加信息:參數計數不匹配。

當我改變代碼不會穿它只是工作的任何參數,代碼比變爲:

delegate void invokeDelegate(); 

... 
In the DoWork function 
... 

if(ovlgrid->InvokeRequired) 
    ovlgrid->BeginInvoke(gcnew invokeDelegate(this, &Form1::AddRow)); 

... 
void AddRow() 
{ 
    array<String^>^row = gcnew array<String^>{"test","test2","test3"}; 
    ovlgrid->Rows->Add(row); 
} 

的問題是,雖然我想傳遞的參數。 我想知道我在做什麼錯誤導致parametercountexception和如何解決這個問題?

回答

2

你遇到的問題是BeginInvoke takes an array of parameters,你傳遞一個數組碰巧是一個參數。

參數

方法

類型:System.Delegate

的委託,取入args指定的參數的方法,其被壓入分派事件隊列。

ARGS

類型:System.Object[]

對象數組傳遞作爲參數給定的方法。可以是null

因此,BeginInvoke藉此意味着你有字符串參數的方法:"test""test2""test3"。你需要傳遞一個只包含你的數組row

array<Object^>^ parms = gcnew array<Object^> { row }; 
ovlgrid.BeginInvoke(gcnew invokeDelegate(this, &Form1::AddRow), parms); 
+0

謝謝,你的解決方案適用於我的問題。我在考慮'... array ^args'是某種可變參數列表,而不是前面三個點的參數數組,因此我現在可以看到我的代碼出了什麼問題。 – LeopardGL 2012-01-30 15:34:27

相關問題