none
DataGridView 跳出 System.ArgumentNullException RRS feed

  • 問題

  • 我的 DataGridView 長時間( 2Hr 以上)顯示不定時會出現這個錯誤訊息,我找不到是什麼樣錯誤造成的,
    DataGridView 都有給值。



    VB2008, Win XP SP3
    我的程式流程是:
    在 Form_Load 中
    建立 UDP 連線-->PLC 讀值放入陣列中-->設定 DataGridview 表格-->陣列值傳給 DataGridview 顯示-->設定 System.Timer 輪詢 PLC。

    System.Timer 輪詢 PLC,讀值放入陣列中-->陣列值傳給 DataGridview 顯示-->System.Timer 啟動-->輪詢 PLC -->System.Timer 啟動-----

    System.Timer 中有穿插 If 判斷式 & 資料庫寫入,這些和DataGridView 比較沒有關係,
    不知道這可以怎麼樣改善?


    程式流程 Code:
    Form_Load 

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
            UDPconn() 'UDP 連線
            PLCcmd()  'PLC 讀值放入陣列中
            ProcessPlate() '設定 DataGridview 表格      
            SkyCar()  '陣列值傳給 DataGridview 顯示
            
            AddHandler SystemTime.Elapsed, AddressOf Timer  '設定 System.Timer 輪詢 PLC
            SystemTime.Interval = 700
            SystemTime.Enabled = True
            GC.KeepAlive(SystemTime)
        End Sub

    PLC 讀值放入陣列中

        Sub Word(ByVal data As String)
            Dim value((Len(data) / 4) - 7) As String
            Dim j As Integer = 29
    
            value(0) = Mid(data, 1, 20)
            For i = 1 To UBound(value)
                value(i) = Mid(data, j, 4)
                j = j + 4
            Next
            Select Case value(0)
                Case "C00002000A0000140001"
                    ReDim HomePage1(UBound(value))
                    value.CopyTo(HomePage1, 0)
                Case "C00002000A0000140002"
                    ReDim HomePage2(UBound(value))
                    value.CopyTo(HomePage2, 0)
             End Select
        End Sub

    設定 DataGridview 表格

        Sub ProcessPlate()
    
            Dim Screen = New DataTable("Info")
            Screen.Columns.Add("NO", Type.GetType("System.String"))
            Screen.Columns.Add("天車", Type.GetType("System.String"))
            Screen.Columns.Add("槽位名稱", Type.GetType("System.String"))
            Screen.Columns.Add("掛序", Type.GetType("System.String"))
            Screen.Columns.Add("A掛料號", Type.GetType("System.String"))
            Screen.Columns.Add("A掛批號", Type.GetType("System.String"))
            Screen.Columns.Add("A片數", Type.GetType("System.String"))
            Screen.Columns.Add("A前電流", Type.GetType("System.String"))
            Screen.Columns.Add("A後電流", Type.GetType("System.String"))
            Screen.Columns.Add("B掛料號", Type.GetType("System.String"))
            Screen.Columns.Add("B掛批號", Type.GetType("System.String"))
            Screen.Columns.Add("B片數", Type.GetType("System.String"))
            Screen.Columns.Add("B前電流", Type.GetType("System.String"))
            Screen.Columns.Add("B後電流", Type.GetType("System.String"))
            Screen.Columns.Add("實際分", Type.GetType("System.String"))
            Screen.Columns.Add("實際秒", Type.GetType("System.String"))
            Screen.Columns.Add("實際溫度", Type.GetType("System.String"))
    
            For i = 1 To 19
                If i < 18 Then
                    Screen.Rows.Add(i)
                Else
                    Screen.Rows.Add(String.Empty)
                End If
            Next
            
            DataGridView1.DataSource = Screen
            DataGridView1.Rows(0).Cells(2).Value = "1 上下料"
            DataGridView1.Rows(1).Cells(2).Value = "2 吹乾"
            DataGridView1.Rows(2).Cells(2).Value = "3 純水洗"
            DataGridView1.Rows(3).Cells(2).Value = "4 抗氧化"
            DataGridView1.Rows(4).Cells(2).Value = "5 純水洗"
            DataGridView1.Rows(5).Cells(2).Value = "6 純水洗"
            DataGridView1.Rows(6).Cells(2).Value = "7 鍍銅"
            DataGridView1.Rows(7).Cells(2).Value = "8 鍍銅"
            DataGridView1.Rows(8).Cells(2).Value = "9 鍍銅"
            DataGridView1.Rows(9).Cells(2).Value = "10 鍍銅"
            DataGridView1.Rows(10).Cells(2).Value = "11 鍍銅"
            DataGridView1.Rows(11).Cells(2).Value = "12 鍍銅"
            DataGridView1.Rows(12).Cells(2).Value = "13 酸浸"
            DataGridView1.Rows(13).Cells(2).Value = "14 純水洗"
            DataGridView1.Rows(14).Cells(2).Value = "15 純水洗"
            DataGridView1.Rows(15).Cells(2).Value = "16 純水洗"
            DataGridView1.Rows(16).Cells(2).Value = "17 清潔"
            DataGridView1.Rows(17).Cells(2).Value = "鍍銅副槽 01"
            DataGridView1.Rows(18).Cells(2).Value = "鍍銅副槽 02"
    
            DataGridView1.ColumnHeadersDefaultCellStyle.Font = New Font("新細明體", 11)
            DataGridView1.Columns(0).Width = 30
            DataGridView1.Columns(1).Width = 50
            DataGridView1.Columns(2).Width = 100
            DataGridView1.Columns(3).Width = 50
            DataGridView1.Columns(4).Width = 180
            DataGridView1.Columns(5).Width = 180
            DataGridView1.Columns(6).Width = 60
            DataGridView1.Columns(7).Width = 70
            DataGridView1.Columns(8).Width = 70
            DataGridView1.Columns(9).Width = 180
            DataGridView1.Columns(10).Width = 180
            DataGridView1.Columns(11).Width = 60
            DataGridView1.Columns(12).Width = 70
            DataGridView1.Columns(13).Width = 70
            DataGridView1.Columns(14).Width = 60
            DataGridView1.Columns(15).Width = 60
            DataGridView1.Columns(16).Width = 80
    
            For i = 0 To 16  
                DataGridView1.Columns(i).SortMode = DataGridViewColumnSortMode.NotSortable
            Next
    
        End Sub
     

    陣列值傳給 DataGridview 顯示

    Sub SkyCar() Select Case CInt(Other1(162)) Case 1 DataGridView1.Rows(0).Cells(1).Style.BackColor = SystemColors.ActiveCaption DataGridView1.Rows(0).Cells(3).Value = Val(HomePage1(71)) DataGridView1.Rows(0).Cells(4).Value = HexstrToChr(String.Join(String.Empty, HomePage1, 1, 10)) DataGridView1.Rows(0).Cells(5).Value = HexstrToChr(String.Join(String.Empty, HomePage1, 11, 10)) DataGridView1.Rows(0).Cells(6).Value = Val("&H" & HomePage1(21)) DataGridView1.Rows(0).Cells(9).Value = HexstrToChr(String.Join(String.Empty, HomePage1, 31, 10)) DataGridView1.Rows(0).Cells(10).Value = HexstrToChr(String.Join(String.Empty, HomePage1, 41, 10)) DataGridView1.Rows(0).Cells(11).Value = Val("&H" & HomePage1(51)) Case 2 DataGridView1.Rows(1).Cells(1).Style.BackColor = SystemColors.ActiveCaption DataGridView1.Rows(1).Cells(3).Value = Val(HomePage1(171)) DataGridView1.Rows(1).Cells(4).Value = HexstrToChr(String.Join(String.Empty, HomePage1, 101, 10)) DataGridView1.Rows(1).Cells(5).Value = HexstrToChr(String.Join(String.Empty, HomePage1, 111, 10)) DataGridView1.Rows(1).Cells(6).Value = Val("&H" & HomePage1(121)) DataGridView1.Rows(1).Cells(9).Value = HexstrToChr(String.Join(String.Empty, HomePage1, 131, 10)) DataGridView1.Rows(1).Cells(10).Value = HexstrToChr(String.Join(String.Empty, HomePage1, 141, 10)) DataGridView1.Rows(1).Cells(11).Value = Val("&H" & HomePage1(151))

    End Select
    End Sub

    在 Form_Load 中設定 System.Timer 輪詢 PLC

            AddHandler SystemTime.Elapsed, AddressOf Timer
            SystemTime.Interval = 700
            SystemTime.Enabled = True
            GC.KeepAlive(SystemTime)

    System.Timer 中的項目

        Sub Timer()
        
            PLCcmd()         
            SkyCar()
    
        End Sub


    • 已編輯 C.Kevin 2012年9月1日 上午 01:16
    2012年9月1日 上午 01:08

解答

  • 我的建議是, 當你要改變 DataGridView 上的值時, 不要直接對 DataGridView 的 Cell 操作.

    而是應該操作它的資料來源

    比方 DataGridView1.DataSource = DataTable1

    你要操作資料應該對著 DataTable1 做.

    另外建議加一層 BindingSource, 未來應用會更有彈性

    ex:

    Dim bs as New BindingSource

    bs.DataSource=DataTable1

    DataGridView.DataSource=bs


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2012年9月1日 上午 05:13
    版主

所有回覆

  • 這個錯誤說明你的檔案和DataGridView上面的字段不匹配(嚴格來說,或許是某個DataGridView的DataTable中的某個Column是主鍵,或者是UniqueKey啥的,結果你弄成了空會拋出此異常哦)。

    我建議您:

    1)檢查DataTable個個Column字段有無類似的東西設置。

    2)Debug後過若干時間,看看那句話拋出此異常?


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年9月1日 上午 02:58
  • 從錯誤訊息來看, 錯誤好像發生在取用DataGridView的內容值時, 傳入的鍵值(Key)不正確引起的
    2012年9月1日 上午 03:03
  • To 編程志愿者:

    1. 我的 DataGridView 資料來源只有陣列而已,表格中沒有主鍵,只有設定Column & Row 數量和 ColumnHeaderName,
        及設定些許 Cell 起始值,如 Sub ProcessPlate() 裡打的設定。
        我有想過會不會是 DataGridView 會不定期重新繪製表格呢? 重新繪製時剛好碰上還未繪製完成造成 DataGridView 找不到 e.ColumnIndex & e.RowIndex 而錯誤。

    2. 圖片的 MessageBox 是 DataGridView 內部自己跳出來顯示的,不是透過 Try....Catch..
        我在程式裡加入下面程式,看有沒有辦法知道哪一行出錯。

        Private Sub DataGridView1_DataError(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewDataErrorEventArgs) Handles DataGridView1.DataError
            Label5.Text = e.ColumnIndex & "   " & e.RowIndex
            Label4.Text = e.Exception.ToString
            Label19.Text = e.Context
        End Sub

    2012年9月1日 上午 05:05
  • 我的建議是, 當你要改變 DataGridView 上的值時, 不要直接對 DataGridView 的 Cell 操作.

    而是應該操作它的資料來源

    比方 DataGridView1.DataSource = DataTable1

    你要操作資料應該對著 DataTable1 做.

    另外建議加一層 BindingSource, 未來應用會更有彈性

    ex:

    Dim bs as New BindingSource

    bs.DataSource=DataTable1

    DataGridView.DataSource=bs


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2012年9月1日 上午 05:13
    版主
  • To tihs :

    您說的鍵值(Key)是不是指 e.Column & e.Row?
    程式裡有用到取用 DataGridView 的內容值,像是" X = DataGridView1.Rows(11).Cells(3).Value " 這樣,
    不過我取用 DataGridView 內容值時是直接指定,告訴程式明確座標位置取值,
    錯誤發生在程式長時間跑時不定時出現的,如果有指定超出範圍的 Cell 索引值會馬上就出現錯誤了。

    2012年9月1日 上午 05:19
  • To Bill Chung :

    您的意思是不是說,對 DataTable1 進行編輯完後,在 system.Timer 輪詢中加入 DataGridView.DataSource = DataTable1,
    這樣才會更新 DataGridView 顯示的內容值,最好加一層 BindingSource 這樣?

    2012年9月1日 上午 05:33
  • http://www.dotblogs.com.tw/billchung/archive/2009/04/12/7981.aspx

    這裡的 Sample Code 有類似的寫法, 你可以參考.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年9月1日 上午 05:38
    版主
  • To Bill Chung:

    謝謝 Bill。
    我剛剛也做了一段練習程式,大概知道怎麼操作了。
    改看看~~~
    • 已編輯 C.Kevin 2012年9月1日 上午 05:59
    2012年9月1日 上午 05:59
  • To 編程志愿者:

    1. 我的 DataGridView 資料來源只有陣列而已,表格中沒有主鍵,只有設定Column & Row 數量和 ColumnHeaderName,
        及設定些許 Cell 起始值,如 Sub ProcessPlate() 裡打的設定。
        我有想過會不會是 DataGridView 會不定期重新繪製表格呢? 重新繪製時剛好碰上還未繪製完成造成 DataGridView 找不到 e.ColumnIndex & e.RowIndex 而錯誤。

    2. 圖片的 MessageBox 是 DataGridView 內部自己跳出來顯示的,不是透過 Try....Catch..
        我在程式裡加入下面程式,看有沒有辦法知道哪一行出錯。

        Private Sub DataGridView1_DataError(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewDataErrorEventArgs) Handles DataGridView1.DataError
            Label5.Text = e.ColumnIndex & "   " & e.RowIndex
            Label4.Text = e.Exception.ToString
            Label19.Text = e.Context
        End Sub

    現在結果如何?

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年9月1日 上午 07:40
  • 移除或註解你這段 Try ... Catch

    編譯成 debug 模式,錯誤訊息左下角會有詳細可參考。

    或是直接用除錯模式跑。

    我看到你並沒有考慮到 PLC 傳回來的資料長度、可能的亂碼,長期跑這是不可避免的,請思考。


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


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

    2012年9月1日 上午 09:42
  • To 編程志愿者:

    新加入的那段程式碼好像不起作用,錯誤出現時還是會另外跳出 MessageBox,
    並沒有如預期會顯示哪一個 Index 出錯,可能是使用方法不對,還在測試中。
    目前還沒弄清楚問題出在哪裡。
    要特別強調一下,程式裡面沒有加入 Try....Catch..抓 Exception,
    MessageBox 是 DataGridView 內部自己的設定。

    2012年9月1日 上午 10:57
  • To Bill Chung:

    特別感謝 Bill Chung 的指導,一開始寫程式的時候沒有想到對 DataTable 編輯就好,只想到畫格子,其餘丟給 DataGridView。
    經過您的提點,我將程式碼由原先直接對 DataGridView 的 Cell 做 Value 的變更,轉換成對 DataTable 的 Rows().Item() 值的變更,
    對於 CPU 的使用率大幅下降,CPU: Pentium 4 ,使用率從平均 80% 以上, 下降至 10~20%。
    目前電腦丟著跑程式中,看後續有什麼狀況。

    謝謝 Bill !

    2012年9月1日 上午 11:04
  • To 心冷熱情息:

    我的程式目前還沒有加進 Try......Catch..抓 Exception,
    圖片顯示的 MessageBox 是 DataGridView 內部預設的彈出視窗,
    本來想要關閉那個功能,在 DataGridView.DataError 事件中打 e.Cancel 卻沒有發揮效果,
    可能是還不用使用..

    我有看過人家經常使用 Debug.Print,您說的編譯成 Debug 模式是說這個嗎?
    除錯模式是不是就是按 F5 的那個功能?

    程式只有處理 Empty,謝謝您的提醒,的確忘記加上判斷資料長度的問題,我會加上去。


    • 已編輯 C.Kevin 2012年9月1日 上午 11:18
    2012年9月1日 上午 11:15
  • 不是。

    F5 等同工具列上的執行。

    F11 是逐步執行,會逐行執行。

    F9 是中斷點。

    在松格倒掉前,有翻譯一本除錯的奧秘,那本不錯,有完整的說明。

    這篇雖然很舊,裡面提到的編譯器出版到現在超過 15年,但是有簡單除錯模式的功能說明:

    除錯講座

    微軟的除厝方式從 DOS 年代到現在都有一貫性,唯一的差異就是原先逐步執行從 F8 換到現在的  F11 。


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


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

    2012年9月2日 上午 04:29
  • To Bill Chung:

    程式跑了 30 幾個小時之後出現了 "DataTable 內部索引已經損壞: '5',InvalidOperationException"
    程式停在變更 " DataTable.Rows(5).Item(2) = 值 " 這裡,
     '5' 的意思可能是指損壞類別,不知道為什麼壞了。

    網路有爬文到可能是執行緒衝突,我的執行緒除主緒只有 System.Timer 運行而已。



    • 已編輯 C.Kevin 2012年9月3日 上午 08:55 更正描述
    2012年9月3日 上午 02:59
  • To 心冷熱情熄:

    我除錯時有用到您及"除錯講座"提到的方法,
    只是不曉得您提到的 Debug 模式 或是 除錯模式 是指那一部份這樣。

    除錯的奧秘幾乎找不到了,只剩零星圖書館還搜索的到。
    謝謝您提供的資訊。
    • 已編輯 C.Kevin 2012年9月3日 上午 03:33
    2012年9月3日 上午 03:31
  • System.Timer 本身就有可能產生好幾個執行緒出來.

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年9月3日 下午 12:21
    版主
  • Debug 模式


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


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

    2012年9月3日 下午 02:37
  • To Bill Chung:

    程式跑快一天時間,現在變成 "BindingSource 無法為其本身的資料來源。請不要將 DataSource 和 DataMember 屬性設定為會回頭參考 BindingSource 的值。"

    請問程式長時間跑有疲勞的問題嗎?
    大約有80 個即時資訊要顯示,所以每秒鐘更新約 80 個 DataTable.Rows().Item()。
    可是感覺 80 個對電腦應該還算游刃有餘才是,每秒刷新幾百個陣列元素都沒什麼感覺。


    • 已編輯 C.Kevin 2012年9月4日 上午 08:58
    2012年9月4日 上午 08:47
  • To 心冷熱情熄:

    我的VB Express 2008 工具欄沒有看到,新增按鈕裡也沒有找到。
    請問不曉得可以去哪設定呢?

    在圖片中的 "組態" 設定嗎?

    用 Visual Studio 2008 開啟,VS 說版本不支援 .vbproj 的專案類型,無法開啟。

    • 已編輯 C.Kevin 2012年9月4日 上午 09:04
    2012年9月4日 上午 08:54
  • To Bill Chung:

    程式跑快一天時間,現在變成 "BindingSource 無法為其本身的資料來源。請不要將 DataSource 和 DataMember 屬性設定為會回頭參考 BindingSource 的值。"

    請問程式長時間跑有疲勞的問題嗎?
    大約有80 個即時資訊要顯示,所以每秒鐘更新約 80 個 DataTable.Rows().Item()。
    可是感覺 80 個對電腦應該還算游刃有餘才是,每秒刷新幾百個陣列元素都沒什麼感覺。



    我猜想你的程式一定有某些地方發生了執行緒競爭或死結, 或是資源釋放的問題,

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年9月4日 上午 09:26
    版主
  • 你的下拉式選單 選 Debug 即可。

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


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

    2012年9月4日 下午 04:26
  • 我把更新 DataTable 與 DataGridView 分開來處理,
    更新 DataTable 不動,變更 DataGridView.Rows().Cells().Style.BackColor 放到 CellPainting 裡,這樣作有比較好一些。
    而我最原始的問題在 DataError 事件有顯示出 Row 和 Column 的索引位置了,
    e.ColumnIndex = -1
    e.RowIndex 則不一定

    Dim ProductionInfoScreen As DataTable

    Select Case CInt(Other1(162)) Case 1 If Not (s = CInt(Other1(162))) Then DataGridView1.Rows(s - 1).Cells(1).Style.BackColor = SystemColors.Window s = 1 End If ProductionInfoScreen.Rows(0).Item(3) = Val(HomePage1(71)) ProductionInfoScreen.Rows(0).Item(4) = HexstrToChr(String.Join(String.Empty, HomePage1, 1, 10)) ProductionInfoScreen.Rows(0).Item(5) = HexstrToChr(String.Join(String.Empty, HomePage1, 11, 10)) ProductionInfoScreen.Rows(0).Item(6) = Val("&H" & HomePage1(21)) ProductionInfoScreen.Rows(0).Item(9) = HexstrToChr(String.Join(String.Empty, HomePage1, 31, 10)) ProductionInfoScreen.Rows(0).Item(10) = HexstrToChr(String.Join(String.Empty, HomePage1, 41, 10)) ProductionInfoScreen.Rows(0).Item(11) = Val("&H" & HomePage1(51)) Case 2 If Not (s = CInt(Other1(162))) Then DataGridView1.Rows(s - 1).Cells(1).Style.BackColor = SystemColors.Window s = 2 End If ProductionInfoScreen.Rows(1).Item(3) = Val(HomePage1(171)) ProductionInfoScreen.Rows(1).Item(4) = HexstrToChr(String.Join(String.Empty, HomePage1, 101, 10)) ProductionInfoScreen.Rows(1).Item(5) = HexstrToChr(String.Join(String.Empty, HomePage1, 111, 10)) ProductionInfoScreen.Rows(1).Item(6) = Val("&H" & HomePage1(121)) ProductionInfoScreen.Rows(1).Item(9) = HexstrToChr(String.Join(String.Empty, HomePage1, 131, 10)) ProductionInfoScreen.Rows(1).Item(10) = HexstrToChr(String.Join(String.Empty, HomePage1, 141, 10)) ProductionInfoScreen.Rows(1).Item(11) = Val("&H" & HomePage1(151)) End Select


    請問,DataGridView 不用委派就可以直接變更 Cell 值,是因為?

    2012年9月7日 上午 06:29

  • 請問,DataGridView 不用委派就可以直接變更 Cell 值,是因為?

    老實講, 這個原因我猜是他們忘了改.

    另外 e.ColumnIndex = -1 一定是錯的, 這表示沒有任何 Column被取得


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年9月7日 上午 06:37
    版主
  • 沒有任何 Column 被取得就很怪了,不知道什麼原因造成 DataTable 損壞。
    再讓程式跑個幾天看看有什麼結果。
    • 已編輯 C.Kevin 2012年9月7日 上午 06:47
    2012年9月7日 上午 06:46
  • 偶而還是有出現錯誤,
    ArgumentNullException 值不能為 Null,
    DataGridView.DataError 顯示的出錯欄位是
    Column = 2
    Row = 1
    e.Context = 2  <--- 查到是 [DataGridViewDataErrorContexts 列舉型別] 裡面的 Display 錯誤,
    該欄位我只有在首次編輯 DataTable 時給值後就沒有再編輯,想請問這一項錯誤可能發生的原因是什麼?
    2012年9月17日 上午 05:16
  • 你有改成用跨執行緒委派去修改 DataTable 嗎 ?


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年9月17日 上午 05:28
    版主
  • 請問,您說的是這樣做嗎?

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim ProductionInfoScreen As DataTable = New DataTable("ProductionInfo") ' 建立 DataTable
    
            ProductionInfoScreen.Columns.Add("NO", Type.GetType("System.String"))
            ProductionInfoScreen.Columns.Add("天車", Type.GetType("System.String"))
            ProductionInfoScreen.Columns.Add("掛序", Type.GetType("System.String"))
    
            ProductionInfoScreen.Rows.Add("0")
            ProductionInfoScreen.Rows.Add("1")
            ProductionInfoScreen.Rows.Add("2")
    
    
            Dim bs As New BindingSource
            bs.DataSource = ProductionInfoScreen
            DataGridView1.DataSource = bs
    
            Cell(0, 2, "1 上下料", ProductionInfoScreen)
            Cell(1, 2, "2 吹乾", ProductionInfoScreen)
            Cell(2, 2, "3 純水洗", ProductionInfoScreen)
           
        End Sub
    
        Private Delegate Sub Table(ByVal Row As Integer, ByVal Column As Integer, ByVal myStr As String, ByVal c As DataTable)
        Private Sub Cell(ByVal Row As Integer, ByVal Column As Integer, ByVal myStr As String, ByVal c As DataTable)
            If InvokeRequired Then
                Dim myUpdate As Table = New Table(AddressOf Cell)
                BeginInvoke(myUpdate, Row, Column, myStr, c)
            Else
                c.Rows(Row).Item(Column) = myStr   
            End If
        End Sub


    • 已編輯 C.Kevin 2012年9月17日 上午 05:54
    2012年9月17日 上午 05:49
  • 你用 Debug 模式的執行檔在跑的話,出問題時,也可以呼叫 VS IDE 環境及原始碼來除錯。

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


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

    2012年9月17日 下午 03:26
  • 請問可以在哪邊開啟這樣子的功能?

    我使用 VB 2008 Express,找不到您說的 Debug 模式,
    最多可以在"專案屬性"中找到可以選擇 Debug 或 Release,
    經過您前一回的解答我有把 專案屬性 ---> 偵錯 ---> 組態  中選為 Debug,
    可是 F5 偵錯使用起來跟以往的使用體驗一樣,跳出的半透明錯誤訊息框也與以往的相同,
    最上方工具列圖示或功能列表也沒有看到您說的功能,
    我在咕狗搜尋 "VB.NET Debug 模式" 關鍵字也沒找到理想的資料,
    不曉得您可不可以給我再多一點的提示。



    • 已編輯 C.Kevin 2012年9月18日 上午 05:31
    2012年9月18日 上午 05:22
  • 上面的意思是,當你選擇你回應圖上的 Debug 模式編譯成 .exe 後,你可以在不開啟 VS IDE 環境下,執行該 .exe ,當發生錯誤時,會跳出對話盒詢問你,是否使用 Visual Studio 除錯,選擇 是 後,將會自動帶入原始程式碼讓你從此時開始除錯。

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


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

    2012年9月18日 下午 03:20
  • 瞭解了~~~~
    以前瀏覽器有些網頁出錯時也會跳出這個選項。

    2012年9月19日 上午 12:18
  • To Bill Chung :

    我將所有變更 DataTable 值的命令全部改成下方委派方式,
    現在程式還在長時間測跑中。
    改變方式後 CPU 使用率有略為降低,
    這個現象是不是告訴我以後程式最好都使用委派呢?

    Cell(0, 2, "1 上下料", ProductionInfoScreen)
            Cell(1, 2, "2 吹乾", ProductionInfoScreen)
            Cell(2, 2, "3 純水洗", ProductionInfoScreen)
           
        End Sub
    
        Private Delegate Sub Table(ByVal Row As Integer, ByVal Column As Integer, ByVal myStr As String, ByVal c As DataTable)
        Private Sub Cell(ByVal Row As Integer, ByVal Column As Integer, ByVal myStr As String, ByVal c As DataTable)
            If InvokeRequired Then
                Dim myUpdate As Table = New Table(AddressOf Cell)
                BeginInvoke(myUpdate, Row, Column, myStr, c)
            Else
                c.Rows(Row).Item(Column) = myStr   
            End If
        End Sub

    2012年9月19日 上午 12:23
  • 應該說, 跨執行緒的處理最好都用委派, 當時從.Net Framework  1.1 改為 2.0 時會做這個要求的改變一定是有它的道理.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年9月19日 上午 12:39
    版主
  • To Bill Chung:

    DataGridView 繫結 DataTable 後,只要 DataTable.Rows.Item 變更, DataGridView 顯示就會跟著變動,
    跨執行緒最常遇到的問題是無法更新 UI 控制項值,需要使用委派,而變更 DataTable 也有這樣的問題呀?

    2012年9月21日 下午 03:45
  • 我講的不太清楚, 應該是: 當 DataTable 有被繫結到某個控制項時才需要.

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年9月21日 下午 03:46
    版主
  • 當 DataTable 有被繫結到某個控制項時才需要.

    喔,是這層關係。
    懂了!!

    謝謝 Bill !
    • 已編輯 C.Kevin 2012年9月21日 下午 04:00
    2012年9月21日 下午 04:00
  • To Bill :

    用委派變更 DataTable 的值,目前跑約一個星期還沒有出過什麼狀況,
    比較不滿意的是滾動 DataGridView Scrollbar 還是會卡卡的,CPU 使用率偶而會偏高,不穩定,
    比如程式在半夜的時後 CPU 使用率會在 50% 附近。
    我有看過別人的 DataGridView 一次顯示 8 萬筆資料,
    Scrollbar  還是流暢自如。

    謝謝 Bill 的幫忙。

    2012年9月27日 上午 03:42