C# 使用BeginInvoke/Invoke获取值
我试图获取DataGridView的行数[dataGridView1.Rows.count]。虽然UI显示DataGridView中已经添加了多行,但我发现行数仍然为0。我发现这可能是线程问题,因此我使用以下代码检索行数:C# 使用BeginInvoke/Invoke获取值,c#,multithreading,C#,Multithreading,我试图获取DataGridView的行数[dataGridView1.Rows.count]。虽然UI显示DataGridView中已经添加了多行,但我发现行数仍然为0。我发现这可能是线程问题,因此我使用以下代码检索行数: public void OnTagsReported( ... ) { ... for( var i = GetDataGridViewRowCount( dgvScanResult ) - 1; i >= 0; i-- ) { var row
public void OnTagsReported( ... )
{
...
for( var i = GetDataGridViewRowCount( dgvScanResult ) - 1; i >= 0; i-- )
{
var row = dgvScan.Rows[ i ];
...
}
...
}
protected int GetDataGridViewRowCount( DataGridView gridView )
{
try
{
if( ! InvokeRequired )
{
return gridView.Rows.Count;
}
var count = 0;
var action = new Action<DataGridView>( delegate( DataGridView c )
{ count = c.Rows.Count; } );
gridView.Invoke( action, gridView );
return count;
}
catch( ObjectDisposedException ) {}
catch( InvalidOperationException ) {}
}
已报告(…)的标签上的公共空白
{
...
对于(var i=GetDataGridViewRowCount(dgvScanResult)-1;i>=0;i--)
{
var row=dgvScan.Rows[i];
...
}
...
}
受保护的int GetDataGridViewRowCount(DataGridView gridView)
{
尝试
{
如果(!invokererequired)
{
返回gridView.Rows.Count;
}
var计数=0;
var操作=新操作(委托(DataGridView c)
{count=c.Rows.count;});
调用(操作,gridView);
返回计数;
}
catch(ObjectDisposedException){}
捕获(无效操作异常){}
}
我知道行数,但不知道这是不是正确的方法。我可以知道你会怎么做吗
感谢大家的关注和意见。为什么您的OnTagsReported方法会出现在另一个线程中?无论如何,有两条评论 第一:是的,您可以这样做,但在GetDataGridViewRowCount中是一个错误。您还应该在gridView上调用InvokeRequest,因为您正在使用gridView.Invoke 第二:最好在正确的线程中调用OnTagsReported方法。那么就不需要GetDataGridViewRowCount方法了
public void OnTagsReported()
{
if (dgvScanResult.InvokeRequired)
{
dgvScanResult.Invoke(new MethodInvoker(OnTagsReported), null);
return;
}
for( var i = dgvScanResult.Rows.Count - 1; i >= 0; i-- )
{
var row = dgvScan.Rows[ i ];
...
}
...
}