dbgrid readonly的問題 |
答題得分者是:cancer
|
shandau
一般會員 發表:5 回覆:6 積分:2 註冊:2011-03-31 發送簡訊給我 |
請問一下各位大大,dbgrid的readonly設為false,是否表示DataSource1.DataSet.State in ( dsEdit)? 那還需要設個修改功能的sb嗎 ?
(我是用simpledataset~如果按修改 再用存檔 simpledataset.applyupdates 第一次ok ,再按修改鍵 修改後存檔就死給我看了>_<) 請指教 Tks if (DataSource1.DataSet.State = dsBrowse) and ((not DataSource1.DataSet.Bof) or (not DataSource1.DataSet.Eof)) then DataSource1.DataSet.edit; |
cancer
高階會員 發表:58 回覆:319 積分:190 註冊:2004-07-31 發送簡訊給我 |
Hello,
DBGrid 設 ReadOnly 不等於不讓使用編輯 DataSet,因為您仍然可以提供 TDBEdit 給人使用,或者以程式碼來修改 DataSet 內容。 ===================引 用 shandau 文 章=================== 請問一下各位大大,dbgrid的readonly設為false,是否表示DataSource1.DataSet.State in ( dsEdit)? 那還需要設個修改功能的sb嗎 ? (我是用simpledataset~如果按修改 再用存檔 simpledataset.applyupdates 第一次ok ,再按修改鍵 修改後存檔就死給我看了>_<) 請指教 Tks if (DataSource1.DataSet.State = dsBrowse) and ((not DataSource1.DataSet.Bof) or ? (not DataSource1.DataSet.Eof)) then ??? DataSource1.DataSet.edit; |
shandau
一般會員 發表:5 回覆:6 積分:2 註冊:2011-03-31 發送簡訊給我 |
|
cancer
高階會員 發表:58 回覆:319 積分:190 註冊:2004-07-31 發送簡訊給我 |
您好
看一下 if (DataSource1.DataSet.State = dsBrowse) and ((not DataSource1.DataSet.Bof) or (not DataSource1.DataSet.Eof)) then DataSource1.DataSet.edit; (not DataSource1.DataSet.Bof) or (not DataSource1.DataSet.Eof) // 用 and 才對 當 DataSet 在 EOF 時,前半段判斷出不在 BOF 時,結果是 true,中間用 or,所以右方不用判斷,就傳回 true。 我覺得奇怪,使用者無法利用 TDBGrid 把 DataSet 置於 BOF 或 EOF,進入編輯模式前,為什麼要判斷 BOF 和 EOF? 如果 DataSet 在 BOF 或 EOF,一定是程式弄出來的,使用者辦不到的,例如 DataSet.First; while not DataSet.EOF do begin //---- DataSet.Next; end; // 這裡記得要加 DataSet.First; 即使下面用了 Close,原因是程式碼有時候會整段搬移或加碼, DataSet.Close; 使用者按下編輯,就要給他編輯,不能因為 DataSet 在 Bof 或 Eof,就禁止修改。如果是項次,存檔前先呼叫 DataSet.First; 下次就不用判斷 BOF 和 EOF,順便自動刪除最後一筆空白資料。 |
shandau
一般會員 發表:5 回覆:6 積分:2 註冊:2011-03-31 發送簡訊給我 |
|
cancer
高階會員 發表:58 回覆:319 積分:190 註冊:2004-07-31 發送簡訊給我 |
Hello,您想清楚
(not DataSource1.DataSet.Bof) or (not DataSource1.DataSet.Eof) 如果 DataSet 是空的,它有可能在 EOF,也可能在 BOF。 如果 DataSet 不是空的,它既不在 EOF,也不在 BOF。 如果一開始 DataSet 在 EOF,那麼 not DataSource1.DataSet.Bof 就會是 true,既然是 true,or 右邊的判斷式就不會判斷下去,而您已經允許 DataSet 在 EOF 時進入編輯狀態了,不是嗎?這並非您要的。 用 (not DataSource1.DataSet.Bof) and (not DataSource1.DataSet.Eof) // 既不在 BOF 也不在 EOF 或 not (DataSource1.DataSet.Bof or DataSource1.DataSet.Eof) 用 if DataSet.Recordcont > 0 不是比較合理嗎?RecordCount 本來就是筆數的意思,何必用迂迴的方法?寫程式應力求簡潔。 ===================引 用 shandau 文 章=================== 謝謝大大回覆: 轉貼原程式文 利用Tdataset:的bof和eof屬性當這兩個接為True代表Tdataset這個資料集是空的,如果有任一個屬性是false 就代表裡面是有資料,所以才能對有資料的資料集進行修改或刪除的動作. |
shandau
一般會員 發表:5 回覆:6 積分:2 註冊:2011-03-31 發送簡訊給我 |
|
cancer
高階會員 發表:58 回覆:319 積分:190 註冊:2004-07-31 發送簡訊給我 |
您好,畫面一打開,馬上設定所有東西是唯讀,當使用者按新增或修改時,才去判斷權限,尤其是修改,常常是針對人而言,而不是針對畫面,您打的單,就只有您能修改和刪除。
權限有,把 dataset 進入編輯狀態,並開放介面元件供編輯。 但注意 TDBGrid 在 Delphi 7 和 2006 有臭蟲,ReadOnly 的 true 和 false 多切換幾次之後,在 DBGrid 上面按 Tab 鍵,游標不會往右跑,而是會往下跑,所以,我都用 Options.dgEditing 來控制。 ===================引 用 shandau 文 章=================== 謝謝樓上大大回覆,說的的確是有道理 我個人是覺得假設gridonly設成false,如果是代表將DataSource1.DataSet.State in ( dsEdit) 那這個edit按鈕似忽就看不出存在的必要,而沒有修改權限的使用者就在進入form時將grid設成唯讀?而有修改權限的使用者則直接使用存檔功能儲存異動資料? |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |