none
DataGridView 繫結 DataTable,刷新 DataTable 影響 DataGridView.Cell 的輸入值 RRS feed

  • 問題

  • 我做了一張資料表,2 個 Column、5 個 Row,與 DataGridView 繫結,
    想透過 DataTable 同時作控制器材的 "設定" 與 "讀取"
    Column1 是 "設定" 器材參數欄位,ex: 設定溫度上升目標值
    Column2 是 "讀取" 器材現值欄位,ex: 當下實際溫度
    想要方便使用者設定溫度的同時可以知道當下實際溫度情況,
    用 SystemTimer 每秒輪詢器材的溫度現值,用委派更新 DataTable 表的 Column2 並 DataGridView 顯示,
    在這邊出現了一個問題,當 DataGridView Column1 正在輸入設定值時,如果設定 Cell 時手腳太慢的話,
    正在編輯的 Cell 會因為每秒 Timer 輪詢更新 DataTable 導致 Cell 會回復編輯前的值,
    這樣的狀況可以改善嗎?



    • 已編輯 C.Kevin 2012年11月16日 上午 08:56
    2012年11月16日 上午 08:52

解答

  • 在 DataGridView.CellBeginEdit 事件 時禁止更新, 然後在DataGridView.CellEndEdit 事件恢復更新 .

    你可以試看看這樣行不行.


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

    • 已標示為解答 C.Kevin 2012年11月19日 上午 01:32
    • 已取消標示為解答 C.Kevin 2012年11月19日 上午 03:04
    • 已標示為解答 C.Kevin 2012年11月19日 上午 05:55
    2012年11月16日 上午 09:26
    版主
  • 暫停 Timer 是一種方法, 還有一種更懶的

    比方你有一個變數來決定要不要更新

    當他回 false 就不更新

    那你把 更新的那段程式碼包在這 if 區段也可以.

    所以 BeginEdit 時, 這個變數就是 fasle

    在 EndEdit 和初始值 這個變數就是 true


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

    • 已標示為解答 C.Kevin 2012年11月19日 上午 05:55
    2012年11月19日 上午 03:26
    版主

所有回覆

  • 在 DataGridView.CellBeginEdit 事件 時禁止更新, 然後在DataGridView.CellEndEdit 事件恢復更新 .

    你可以試看看這樣行不行.


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

    • 已標示為解答 C.Kevin 2012年11月19日 上午 01:32
    • 已取消標示為解答 C.Kevin 2012年11月19日 上午 03:04
    • 已標示為解答 C.Kevin 2012年11月19日 上午 05:55
    2012年11月16日 上午 09:26
    版主
  • 謝謝 Bill ,說不定是一個不錯方法。
    2012年11月19日 上午 01:31
  • Bill 大大~~

    我找了 OleDbDataAdapter 和 BindingSource 似乎沒有找到能暫停更新的命令。

    如果沒有暫停更新的方法,可以請 Bill 大大給我有關製作發文中的功能建議嗎? 還是我找錯資料方向了。

    如果真不能暫停,我可慮製作兩張 Table 了。



    • 已編輯 C.Kevin 2012年11月19日 上午 03:04
    2012年11月19日 上午 03:00
  • 啊~!

    還是 Bill 大大的意思是要我在 DataGridView.CellBeginEdit 中暫停 SystemTimer,DataGridView.CellEndEdit 回復 SystemTimer 呢?

    2012年11月19日 上午 03:07
  • 暫停 Timer 是一種方法, 還有一種更懶的

    比方你有一個變數來決定要不要更新

    當他回 false 就不更新

    那你把 更新的那段程式碼包在這 if 區段也可以.

    所以 BeginEdit 時, 這個變數就是 fasle

    在 EndEdit 和初始值 這個變數就是 true


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

    • 已標示為解答 C.Kevin 2012年11月19日 上午 05:55
    2012年11月19日 上午 03:26
    版主
  • 我看了一下我的程式碼,Column1 "設定" 器材參數欄位在 DataGridView.CellBeginEdit 用到 BindingSource .EndEdit 及 OleDbDataAdapter.Update()
    在還沒觸發 CellBeginEdit 前會被 Timer 裡每秒刷新 Cell 值的關係讓正在編輯的 Cell 回復到前值。

    無法避免編輯 "設定"的 Cell (Column1),暫停 Timer 可能是一個較簡單的方法,一方面溫度不會突然上升(Column2 顯示值),
    編輯 Column1 的時間又很短暫不會影響到使用者觀看當下溫度的情況(讓 Timer 短暫停止),Column1 編輯完 Timer 就啟動,Timer 啟動,Column2 就會跟著更新,
    暫停 Timer 看起來是一個不錯的選擇。

    謝謝 Bill 的建議與提示!


    我在 DataGridView.CellBeginEdit 暫停 Timer,在 DataGridView.CellEndEdit 恢復 Timer。


    • 已編輯 C.Kevin 2012年11月19日 上午 05:58
    2012年11月19日 上午 05:54