關於DBGrideh出現Dataset not in edit or insert mode

      前兩天一直在對DBGrideh 進行操作,我是做一個checkbox 的選擇框,對沒勾選的記錄點擊進行添加數據,對有勾選的記錄點擊進行是否刪除數據。我是在選擇框的數據改變是事件onupdatedata的事件中對數進行修改,但有時候可以修改,有時候就會出現adoquery1: dataset not in edit or insert mode 的錯誤,我百思不得其解。

        在網上找了好久,有人說是把DBGrideh 關連的adoquery 的locktype的值設爲ltBatchOptimistic,但這只能在正確的操作時纔不會出錯。但可想而知道,你做的軟件是給別人用的,不是給自己用的,你必須考慮到別人有可能出現在錯誤操作,從而對這個錯誤操作進行處理。

        經過我好長時間的測試,我發現在DBGrideh 的事件或是在DBGrideh 的colouns 的事件中對DBGrideh 的值和對DBGrideh 關連的adoquery的值進行修改就會產生adoquery1: dataset not in edit or insert mode 的錯誤,我之前有的沒有出錯的原因是因爲我是在事件裏新創建一個窗體,然後在這個窗體的某一個事件或某一個控件的事件裏對DBGrideh 的值和對DBGrideh 關連的adoquery的值進行修改。也就是說不用要在DBGrideh 的事件或是DBGrideh 的colouns 的事件中對其數據進行修改就不會出錯了。

      但是我在想,你不可能每次都要跳出一個窗體,再對這個窗體進行操作之後纔會對DBGrideh 的數據進行修改。只要在DBGrideh 的事件或是在DBGrideh 的colouns 的事件中要修改時,跳到另一個窗體或控件,然後讓這個窗體或控件自動執行代碼,而沒有顯示什麼東西出來不就可以了!想通了之後我第一個想到的就是Timer控件。只要把Timer的Enabled默認值設爲false,把Timer的Interval的值設得小一點(可以在10左右),把要修改數據的代碼放在Timer的ontimer事件裏,但是在這些代碼前要先放上Timer1.Enabled:=false;  之後只要在需要執行修改數據的代碼時把Timer1.Enable:=true;就可以了。

      我想到的目前就是用新窗體各Timer來解決,希望名位看者能想出更好的解決辦法,到時也給我留下言,讓我也能多學點東西!

發佈了6 篇原創文章 · 獲贊 6 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章