none
DataGridView 刷新的奇怪現象 RRS feed

  • 問題

  • 各位先進們好

    我遇到的這個刷新問題的問題點不知該從何找起

    另外開一個Form,除了沒做額外運算外,資料繫結方式跟主程式是一樣的

    但額外開的Form完全沒問題,我的主程式DataGridView刷新就是有問題

    所以上來問看看有沒有其他人有遇過這樣的狀況的

    我主程式做完資料運算後,指定DataGridView1.DataSource=Table1

    然後用一個副程式對DataGridView的各個Column做繫結
    DataGridView1.Columns("欄位名稱").DataPropertyName = Table1.Columns("欄位名稱").ColumnName N個

    資料顯示,第一次顯示正常

    再來設了一個"下一個"按鈕,做的事情是篩選下一個要呈現的資料

    按鈕上我先設了

    DataGridView1.ClearSelection()
    clearCol()	' 取消所有欄位繫結的副程式,全是DataGridView1.Columns("欄位名稱").DataPropertyName = nothing
    DataGridView1.DataSource = Nothing

    進行資料篩選後將資料載入Table1,再回到主程式運算後指定DataGridView1.DataSource=Table1

    但對各個欄位做資料繫結後問題出現了,我的DataGridView上沒有出現任何東西,要按一下表頭,資料才會呈現

    試了很多方法都不知道該怎麼搞定這個問題,Refresh整個程式都放遍了也沒有任何作用

    另開用來做測試的Form都沒有這個問題,讓我不知從何下手

    整個程式找遍了,會動到DataGridView的地方就這3個 ( 副程式取消欄位繫結、主程式指定Source與欄位繫結、"下一個"鍵將Source指定nothing )

    苦惱......




    • 已編輯 GISK 2012年10月26日 上午 03:13 補充上色
    2012年10月26日 上午 01:58

解答

  • 找到原因了

    問題是出在Table1的清除方法上,跟DataGridView沒關係......吐血

    我把表格清空的方法是Table1.Reset()

    改成Table1.Clear()就OK了

    我讀表格的大約流程:

    Table1.Reset()
    下SQL指令,DataAdapter.Fill(DS,"Table1")
    主程式運算
    執行繫結

    MSDN上說Clear()方法在DataSet繫結至 XmlDataDocument時會有問題我才沒採用

    只是我不是很懂Reset()怎麼會影響資料繫結

    第一次繫結就沒問題...

    請各位先進們能指導一下,非常感謝


    • 已編輯 GISK 2012年10月30日 上午 02:59 小改內容
    • 已標示為解答 GISK 2012年11月1日 上午 02:57
    2012年10月30日 上午 02:53

所有回覆

  • 你的代码把数据源给清空了,所以无法显示数据了。会不会是这个问题呢?不妨尝试?

    按鈕上我先設了

    DataGridView1.ClearSelection()
    clearCol()	' 取消所有欄位繫結的副程式,全是DataGridView1.Columns("欄位名稱").DataPropertyName = nothing
    DataGridView1.DataSource = Nothing
    DataGridView1.DataSource = 新的数据源

    我的博客园
    慈善点击,点击此处
    和谐拯救危机,全集下载,净化人心

    2012年10月26日 上午 02:49
  • 编程志愿者您好

    我在主文中有寫到「再回到主程式運算後指定DataGridView1.DataSource=Table1」

    資料是有的,問題在DataGridView不會顯示出來,需要使用者按一次表頭才會刷新

    刷新後資料也都正確的呈現,確實是下一個我想顯示的給使用者看的資料

    所以問題也不會在Table1

    2012年10月26日 上午 03:11
  • 程式運作大約是這樣

    ' Load_Event

    '預設DataGridView不可視
    DataGridView1.AutoGenerateColumns = False ' 不自動增加資料行

    ' 資料篩選選擇
    '篩選完第一筆要呈現的資料後將資料載入Table1
    OledbDataAdapter.Fill(DS,"Table1")

    ' 主程式

    ' ...
    '資料運算
    '...
    '運算完畢顯示DataGridView
    DataGridView1.Visible=True
    DataGridView1.DataSource=Table1
    setColSource()	' 對各欄位資料繫結

    ' 下一個鍵

    DataGridView1.ClearSelection()
    clearCol()	' 取消所有欄位繫結的副程式
    DataGridView1.DataSource = Nothing
    ' ...
    ' 資料篩選
    ' 回到主程式

    按"下一個"鍵後回到主程式運算,如果我在主程式指定DataSource與欄位繫結之後用程式指定選擇DataGridView1的第1個Cell,會擲出例外事件

    目前的狀況就是,只有第一次指定DataGridView1.DataSource=Table1時會顯示資料

    在經過DataGridView1.DataSource=nothing之後就必須按一次表頭才會顯示資料,放Refresh也沒有作用


    • 已編輯 GISK 2012年10月26日 上午 04:00 修正名稱錯誤
    2012年10月26日 上午 03:31
  • 你好,可否整頁Source Code貼上來?從你給的資料中,好像沒什麼問題。


    大家一齊探討、學習和研究,謝謝!
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD,
    MCT, Microsoft Community Star(TW & HK),
    Microsoft MVP for VB.NET since 2003
    My MSMVP Blog

    2012年10月26日 上午 06:38
  • KenLin您好

    其實就是因為看不出什麼問題我才感到納悶,我另開一個極簡略的Windows Form去跑,繫結方式也是照主程式流程,沒有這些怪問題

    ' ...
    
    ' 主程式運算
    
    ' ...
    
    ' 顯示 DataGridView --進項憑證表格
    進項憑證表格.Visible = True
    進項憑證表格.DataSource = 進項憑證表
    進項憑證表格繫結()
    
    
    
    Private Sub 進項憑證表格繫結()
      進項憑證表格.Columns("歸屬年月").DataPropertyName = 進項憑證表.Columns("歸屬年月").ColumnName
      進項憑證表格.Columns("發票日期").DataPropertyName = 進項憑證表.Columns("發票日期").ColumnName
      進項憑證表格.Columns("發票類別").DataPropertyName = 進項憑證表.Columns("發票類別").ColumnName
      進項憑證表格.Columns("開立廠商").DataPropertyName = 進項憑證表.Columns("開立廠商").ColumnName
      進項憑證表格.Columns("進項稅").DataPropertyName = 進項憑證表.Columns("進項稅").ColumnName
      進項憑證表格.Columns("進項金額").DataPropertyName = 進項憑證表.Columns("進項金額").ColumnName
      進項憑證表格.Columns("已付款1").DataPropertyName = 進項憑證表.Columns("已付款").ColumnName
      進項憑證表格.Columns("發票號碼1").DataPropertyName = 進項憑證表.Columns("發票號碼").ColumnName
      進項憑證表格.Refresh()
    End Sub
    
    Private Sub 下一家(sender As System.Object, e As System.EventArgs) Handles 下一家鍵.Click
            進項憑證表格.ClearSelection()
            進項憑證表格.DataSource = Nothing
    
            ' 做資料篩選
    
            ' ...
          
            ' 回主程式
    End Sub

    這是有關DataGridView部份的程式碼

    另外一提...DataGridView其實有2個,繫結方式一樣,但都是同樣的情形

    真的需要整個程式碼我也可以提供,不過貼在這似乎不太適合,整個程式碼是700多行的...


    • 已編輯 GISK 2012年10月26日 上午 08:52 補上DataGridView的預設屬性
    2012年10月26日 上午 08:37
  • 不知道跟DataGridView的屬性有沒有關係,一併補上來

    2012年10月26日 上午 08:52
  • 執行畫面

    Step 1

    Step 2


    2012年10月26日 上午 09:08
  • Step 3

    Step 4

    2012年10月26日 上午 09:09
  • 你可以在資料填完後,用 DataGridView.Refresh


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年10月27日 上午 08:41
  • 心冷熱情熄 您好

    我上面的程式碼在繫結完最後一行有做Refresh

    不過沒用就是了

    不管放哪兒都沒用,我主文有提到

    Refresh整個程式都放遍了也沒有任何作用

    2012年10月27日 下午 03:53
  • 若有多緒或委派,Refresh 須等 CPU 空出來才會重整畫面。

    若無以上情形,在 Refresh 上設中斷點,檢查 DataGridView 目前裡面的資料狀況。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年10月28日 上午 04:34
  • 心冷熱情熄 您好

    程式內沒用到多緒和委派

    這兩類我最近才剛開始接觸,還在找資料學習中,沒有用在我的程式內

    還有您所建議的在Refresh上設中斷點看資料狀態

    我的測試結果如下:

    在Refresh設中斷點,然後執行一步,讓程式停在End Sub上再查看

    第一次顯示,資料正常

    按下一家鍵篩選出第二家的資料,程式停在Refresh上,執行一步,此時DataGridView的狀態是沒按下表頭(因中斷點跳回程式)

    按下表頭前的DataGridView1.DataPropertyName狀態有繫結到Table1名稱
    查看路徑為:DataGridView1>Columns>List>(0)~(N)>TextBoxColumn>DataProPertyName

    但Rows裡面沒有資料
    查看路徑為:DataGridView1>Rows>List,此時RowCount為0,List無資料

    在下一家鍵第一行程式碼設中斷點

    程式繼續進行到畫面出現,按下表頭後資料出現,按下一家鍵(但因中斷點設在第一行故沒有執行到任何程式)

    查看Rows裡變成有資料,List裡的Count有數值,List也有資料

    重啟程式,重覆中斷步驟

    第一次顯示正常,按下一家鍵篩選出資料,進行到Refresh

    查看DataGridView1.DataPropertyName有繫結到Table1,Rows>List無資料,Count為0

    進行到顯示畫面,不按下表頭,按下一家鍵(但因中斷點設在第一行故沒有執行到任何程式)

    查看DataGridView1.DataPropertyName有繫結到Table1,Rows>List無資料,Count為0


    先謝謝各位先進花時間在我的問題上

    如果我的測試方式有什麼地方錯誤或有更好的建議,還請各位先進們不吝賜教,感激不盡

    2012年10月29日 上午 02:14
  • 下午抽了個空,測試一下Refresh能不能正常刷新原有頁面

    結果是可以的

    i=0
    Do While 進項憑證表.Rows.Count > i      
         進項憑證表.Rows(i)("已付款") = "V"      
         i += 1
    Loop
    進項憑證表格.Refresh()

    "已付款"欄位原是空白,執行完while迴圈後"已付款"欄位有刷新成"V"

    那問題應該是繫結的關係了吧?

    但要按一下表頭才會進行繫結好像也挺奇怪的...?

    2012年10月29日 上午 09:03
  • 你用 F11 逐步檢查,可能是你呼叫副程式放在啟動事件中,造成事件並非是以你想像中的順序啟動。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年10月29日 下午 03:42
  • 心冷熱情熄 前輩您好

    用F11逐步執行,程式的流程如下:

    在Form_Load事件只有設  DataGridView1.AutoGenerateColumns = False ' 不自動增加欄位
    ' 設成True情況是一樣的

    之後進入程式主頁面讓使用者選擇條件 (同執行畫面 Step 1)

    選擇篩選條件後才會進入主程式運算,運算結束後就進行資料顯示,第一次繫結顯示正常 (同執行畫面 Step 2)

    ' 顯示 DataGridView --進項憑證表格
    進項憑證表格.Visible = True
    進項憑證表格.DataSource = 進項憑證表
    進項憑證表格繫結()

    按下一家鍵會重新篩選資料,再進入主程式進行運算後顯示,此時才會出現顯示問題 (同執行畫面 Step 3)

    程式流程確實沒錯,有進入欄位繫結的副程式,清除繫結的副程式也有把DataPropertyName清空

    按下下一家鍵後的程式流程是:

    進項憑證表格.ClearSelection()
    清除欄位繫結() ' 所有欄位清除資料繫結 DataPropertyName=nothing 
    進項憑證表格.DataSource = Nothing

    ' 資料篩選

    ' 進入主程式

    ' 主程式運算完畢

    '所有欄位進行資料繫結 DataPropertyName= Table1.Columns("名稱").ColumnName

    而問題就出在按下下一家鍵後的繫結上 (參考執行畫面 Step 4)

    如果繫結流程有問題應該是第一次顯示畫面就出不來了

    但按下表頭資料出現也表示繫結是成功的不是嗎?

    不懂怎麼會需要按下表頭才會出現資料...


    • 已編輯 GISK 2012年10月30日 上午 01:32
    2012年10月30日 上午 01:21
  • 找到原因了

    問題是出在Table1的清除方法上,跟DataGridView沒關係......吐血

    我把表格清空的方法是Table1.Reset()

    改成Table1.Clear()就OK了

    我讀表格的大約流程:

    Table1.Reset()
    下SQL指令,DataAdapter.Fill(DS,"Table1")
    主程式運算
    執行繫結

    MSDN上說Clear()方法在DataSet繫結至 XmlDataDocument時會有問題我才沒採用

    只是我不是很懂Reset()怎麼會影響資料繫結

    第一次繫結就沒問題...

    請各位先進們能指導一下,非常感謝


    • 已編輯 GISK 2012年10月30日 上午 02:59 小改內容
    • 已標示為解答 GISK 2012年11月1日 上午 02:57
    2012年10月30日 上午 02:53