2012-11-22 44 views
0

我想獲取DataGridView [dataGridView1.Rows.Count]的行數。我發現,雖然UI顯示已經在DataGridView中添加了多行,但行計數仍然爲0。我想通了,這可能是一個線程thinggy所以我用下面的代碼來檢索行數:使用BeginInvoke獲取價值/調用

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) {} 
} 

我得到的行數,但不知道如果這是正確的方式。我可以知道你會怎麼做?

謝謝大家的關注和意見。

回答

0

爲什麼您的OnTagsReported方法在另一個線程中?無論如何,兩條評論。

第一:是的,你可以這樣做,但在GetDataGridViewRowCount是一個錯誤。你也應該在gridView上調用InvokeRequired,因爲你稍後會使用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 ]; 
    ... 
    } 
    ... 
}