我在C ++ .NET表单应用程序中有一个后台工作程序,它运行异步。在这个后台工作者的DoWork函数中,我想在datagridview中添加行,但是我无法弄清楚如何使用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以及如何解决这个问题?
答案 0 :(得分:2)
你遇到的问题是BeginInvoke
takes an array of parameters并且你传递了一个恰好是一个参数的数组。
<强>参数强>
方法
输入:
System.Delegate
获取
args
中指定的参数的方法的委托,该方法被推送到Dispatcher事件队列。ARGS
输入:
System.Object[]
要作为参数传递给给定方法的对象数组。可以是
null
。
因此,BeginInvoke
认为您的方法有{strong> 3 字符串参数:"test"
,"test2"
和"test3"
。您需要传递一个仅包含row
:
array<Object^>^ parms = gcnew array<Object^> { row };
ovlgrid.BeginInvoke(gcnew invokeDelegate(this, &Form1::AddRow), parms);