2015年1月9日 星期五

[C#] dataGridView當掉問題

以下是靠著在學時學的C#功能寫winForm的結果
就是所謂的鳥蛋教學
但至少可以解決問題啦(抓頭

dataGridView當掉的圖如下

 多麼好笑的圖

我遇到的掉當原因為
我在winForm裡是使用Thread
當Thread抓取到某個值後需修改dataGridView (addRows)
但是控制dataGridView的其實是winForm的UI Thread

通常這樣寫會出現下列Exception

類型 'System.InvalidOperationException' 的未處理例外狀況發生於 System.Windows.Forms.dll

其他資訊: 跨執行緒作業無效: 存取控制項 'dataGridView1' 時所使用的執行緒與建立控制項的執行緒不同。


如果你說沒有發生 (σ ゚∀ ゚)σ 快來去看看你的Form Load是否多加了一行
Form.CheckForIllegalCrossThreadCalls = false;

雖然加上了會省了很多問題(忽略跨執行緒的問題)
但也讓我抓這個 dataGridView當掉問題抓了很久
因為一點Exception都沒有
就直接叉叉呈現

這時候我們只好踏實點寫了
把它委派(delegate)

先宣告類別變數
// 委派DataGridView使用
private delegate void GridViewAddRows(String str);

後面帶的參數請依需求更改類別 但是一次好像只能丟一個值
接下來寫方法,想對dataGridView addRows時呼叫
大概的意思好像是如果需要委派,就把它委派(this.Invoke(addRows, str))
若已委派,就執行你要它幹嘛就幹嘛(喂

private void InvokeGridViewAddRows(String str)
{
            if (this.InvokeRequired)
            {
                GridViewAddRows addRows = new GridViewAddRows((InvokeGridViewAddRows));
                this.Invoke(addRows, str);
            }
            else
            {
                    // 在這裡寫入原本取到str後要對dataGridView做的事
            }
}

總之還是請大家多多Google再寫(冒汗

以上

沒有留言:

張貼留言