none
DataTable.Reset後資料顯示問題 RRS feed

  • 問題

  • Dim TmpTable As New DataTable ' 暫用表

    我會放不同資料表的資料進TmpTable,並使用同一個DataGridView顯示出來

    若使用TmpTable.Clear() 只是清空資料表,原資料表結構還在無法存放下個資料表

    若使用TmpTable.Reset() 可以存放不同資料表,但第二筆資料表DataGridView資料不會正常顯示,要點表頭進行排序時才會顯示(有refresh)

    DataGridView1.DataSource = Nothing
    TmpTable=LoadTable("select * from Table1","Tmp") ' 會呼叫不同的資料表Table1,Table2,Table3
    DataGridView1.DataSource = TmpTable
    DataGridView1.Refresh()

    Private Function LoadTable(ByVal vSQL As String, Optional ByVal TablebName As String = Nothing) If TablebName = Nothing Then Dim str() As String = vSQL.Split(" ") TablebName = str(Array.IndexOf(str, "from") + 1) End If If IsNothing(DS.Tables(TablebName)) = False Then DS.Tables(TablebName).Reset() DA.SelectCommand = New OleDbCommand(vSQL, SQLconn) DA.Fill(DS, TablebName)
    Return DS.Tables(TablebName)

    End Function

    不想在資料集存放過多資料表所以才想將資料表都放在同一個暫用表,請教各位前輩有改進方法嗎?

    還是就直接犧牲記憶體空間了 :O



    • 已編輯 GISK 2013年4月16日 上午 09:36 補入DataGridView程式碼
    2013年4月16日 上午 09:28

解答

所有回覆

  • 您好,

    我們之前是使用 Reset + Clear, 您可以試看看,

    Private Function LoadTable(ByVal vSQL As String, Optional ByVal TablebName As String = Nothing)
    	If TablebName = Nothing Then
            Dim str() As String = vSQL.Split(" ")
            TablebName = str(Array.IndexOf(str, "from") + 1)
        End If
        If IsNothing(DS.Tables(TablebName)) = False Then 
    		DS.Tables(TablebName).Reset()
    		DS.Tables(TablebName).Clear()
    	end if
        DA.SelectCommand = New OleDbCommand(vSQL, SQLconn)
        DA.Fill(DS, TablebName)
        Return DS.Tables(TablebName)
    End Function


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2013年4月16日 上午 09:59
  • 感謝亂馬客 前輩的回復

    情形不變呢,資料還是會被隱藏住,只有點欄位表頭排序才會顯示

    MSDN上只有說重設為原始狀態

    2013年4月17日 上午 12:22
  • 您好,

    目前我測試以下3種方式是ok的,

    Way1: Remove

    DS.Tables(TablebName).Reset()
    DS.Tables(TablebName).Clear()

    =>

    DS.Tables.Remove(TablebName)

    Way2: 版大 bauann 說的 Clear Org DataTable Columns

    DS.Tables(TablebName).Clear()
    DS.Tables(TablebName).Columns.Clear()

    Way3: 傳出Copy

    Return DS.Tables(TablebName).Copy


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/


    • 已編輯 亂馬客 2013年4月17日 上午 02:10 補上bauann及其他方式
    • 已標示為解答 GISK 2013年4月17日 上午 02:43
    2013年4月17日 上午 01:57
  • 感謝亂馬客 前輩的回復

    情形不變呢,資料還是會被隱藏住,只有點欄位表頭排序才會顯示

    MSDN上只有說重設為原始狀態

    Hi, 如果沒有記錯的話,reset是把資料內容回復成原始狀態,也就是忽略資料表上的所有變更,測試起來,你現在的問題也是出在呼叫reset;你可以試試看,不要去呼叫reset,在clear之後,加上tmpTable.Columns.Clear把欄位清空,然後填入新資料。

    請注意討論區相關規則,良好的討論環境需要大家共同努力、遵守


    • 已編輯 bauannModerator 2013年4月17日 上午 01:59 錯別字
    • 已提議為解答 亂馬客 2013年4月17日 上午 02:06
    • 已標示為解答 GISK 2013年4月17日 上午 02:43
    2013年4月17日 上午 01:58
    版主
  • 謝謝 亂馬客,bauann 前輩的指點

    TO bauann 前輩
    我一直忽略了還有將欄位清空這個方式,感謝bauann前輩的提醒,解決了我的問題 : )

    TO 亂馬客 前輩
    Remove後再Fill,有點多此一舉
    一開始我也想過這個方式,不過這樣就失去原本想要的效果,資料集還是要有創造一個資料表的手續
    使用Copy我就無法修改內容啦,回傳的資料表跟資料集內的資料表無相干,要再經過add再update
    效率與使用上稍微不方便
    但這些確實都是種解決方式XD


    2013年4月17日 上午 02:52
  • 我又發現了一個問題

    如果使用tmpTable.Columns.Clear()

    而有一個資料表是由VS的資料連線精靈載入的資料表

    那我要對這個資料表 在程式內 重新select資料時會出現錯誤

    Cannot remove this column, because it's part of the primary key.

    這樣我的LoadTable就不能寫成讀取資料表的通用函式了

    Private Function LoadTable(ByVal vSQL As String, Optional ByVal TablebName As String = Nothing)
        If TablebName = Nothing Then
            Dim str() As String = vSQL.Split(" ")
            TablebName = str(Array.IndexOf(str, "from") + 1)
        End If
        If IsNothing(DS.Tables(TablebName)) = False Then 
            DS.Tables(TablebName).Clear()
            DS.Tables(TablebName).Columns.Clear()
        End If
        DA.SelectCommand = New OleDbCommand(vSQL, SQLconn)
        DA.Fill(DS, TablebName)
        Return DS.Tables(TablebName)
    End Function

    PK鍵值要拿來做Find,不能清掉

    我苦惱了Orz

    2013年4月17日 上午 08:16
  • PK鍵值要拿來做Find,不能清掉

    我苦惱了Orz

    Hi, 多加一行移除PK的程式碼

    dataGridView1.DataSource = null;
    tmpTable.PrimaryKey = null;
    tmpTable.Clear();
    tmpTable.Columns.Clear();
    da.Fill(tmpTable);
    da.FillSchema(tmpTable, SchemaType.Source);
    dataGridView1.DataSource = tmpTable;
    不過話說回來,其實我覺得這樣的動作流程,跟直接Dispose掉舊的datatable,之後建立新的應該沒什麼差別哩

    PS: 忘了是VB版,上面NULL用Nothing取代一下


    請注意討論區相關規則,良好的討論環境需要大家共同努力、遵守

    • 已標示為解答 GISK 2013年4月18日 上午 07:11
    2013年4月17日 上午 08:45
    版主