none
無法更新datagrid? RRS feed

  • 問題

  •  

    各位請教一下,我利用thread 去作DataTable資料的新增

    DataRow row = Table.NewRow();
    row.ItemArray = array;
    Table.Rows.Add(row);
    dataGrid1.Refresh();

    執行時發生錯誤訊息  訊息如下

    類型 'System.NotSupportedException' 的未處理例外狀況發生於 System.Drawing.dll

    其他資訊: Control.Invoke 必須用來與不同執行緒所建立的控制項進行互動。

    後來我改寫成

    delegate void SetRefreshCallback();

    ........

    DataRow row = Table.NewRow();
    row.ItemArray = array;
    Table.Rows.Add(row);
    //dataGrid1.Refresh();
    SetRefresh();

    ................

       private void SetRefresh()
            {
                if(this.dataGrid1.InvokeRequired)
                {
                    SetRefreshCallback d= new SetRefreshCallback(SetRefresh);
                    this.Invoke(d);
                }
                else
                {
                    this.dataGrid1.Refresh();
                }
            }

    程式確實有去執行 SetRefresh()

    但是Datagrid上新增加的資料卻還是沒有出現

    我弄了半天卻都是一樣,請問有人知道該如何處理嘛?

     

    2006年11月29日 上午 11:35

解答

  • 謝謝各位  已經可以了

    我利用THREAD 再裡面動一點小手腳

    避免因while迴圈導致一直產生新的thread

    目前已經正常

    因為BackgroundWorker無法適用在智慧型裝置上

    所以下次有機會再試試  謝謝喔

     

    2006年11月30日 上午 06:21

所有回覆

  • 因為你是在另一個執行緒上做新增,所以可能會有一個問題,就是你的 Table.Rows.Add() 跑完以後,是否資料真的進了 Table? 這個你可能要檢查一下 .

    至於你說程式有跑到 SetRefresh(),但你是否能確定程式有跑到裡面的 this.DataGrid1.Refresh() ?,如果確定,那可能就是我前面說的問題了 .

    2006年11月29日 上午 11:39
    版主
  • 我去檢查過Table 可以見到他的 count 有增加

    而且確實有資料進去

    但是至於SetRefresh的部份

    它都是執行到

    SetRefreshCallback d= new SetRefreshCallback(SetRefresh);
    this.Invoke(d);

    沒有執行到

    this.dataGrid1.Refresh();

    2006年11月29日 下午 12:07
  • 如果你是用 Visual Studio 2005 (.NET Framework 2.0) 的話,建議你使用 BackgroundWorker 來做會比較方便,但若是 .NET 1.x,那你可看看這篇:

    http://www.microsoft.com/taiwan/msdn/library/2002/Oct-2002/winforms08162002.htm

    2006年11月29日 下午 12:17
    版主
  • 我的程式主要是在建立socket連線後  等候對方不定時的傳送訊息

    所以要用while迴圈來等候,等到收到訊息之後再將訊息新增到Datagrid

    可能因為程式都在等待 socket.ReceiveFrom 這一行

    所以才會無法讓DataGrid這個UI得以更新

    while(true)

    {

    socket.ReceiveFrom(某一個遠端的HOST)

    之後將所收到的data 加入datagrid

    }

    不知道這樣的情形是否適用BackgroundWorker

    如果適用的話 是不是把整個while迴圈內的東西都搬到

    Background來執行呢?

    2006年11月29日 下午 03:32
  • 謝謝各位  已經可以了

    我利用THREAD 再裡面動一點小手腳

    避免因while迴圈導致一直產生新的thread

    目前已經正常

    因為BackgroundWorker無法適用在智慧型裝置上

    所以下次有機會再試試  謝謝喔

     

    2006年11月30日 上午 06:21