線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2679
推到 Plurk!
推到 Facebook!

選取資料

答題得分者是:sryang
rita.i880
一般會員


發表:19
回覆:35
積分:10
註冊:2007-07-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-04-25 10:11:34 IP:59.125.xxx.xxx 未訂閱
各位好 :
dbgrid 可以複選, 但當資料被選取後, 系統還要自動判定此筆資料是否可以被選取,
若不行則由系統自動取消資料被選的動作, 請問該如何做呢? 謝謝!!
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-04-25 11:20:25 IP:211.79.xxx.xxx 訂閱
DBGrid 並沒有「項目被選取」的事件,所以你想要使用 DBGrid 的多選機制來做這件事情,是有困難的
您可以參考一下 這一篇 以及 這一篇

再說,DBGrid 的多選機制真的是難用到爆,Ctrl 要按住不說,選取的標記又是小之又小,還是早早換掉為好啊
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
rita.i880
一般會員


發表:19
回覆:35
積分:10
註冊:2007-07-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-04-25 13:38:04 IP:59.125.xxx.xxx 未訂閱
謝謝你的提供的方式, 
dbgrid 確實不是很方便, 但難道沒有其他的方式以對dbgrid 做控制了嗎 ?

=================引 用 sryang 文 章===================
DBGrid 並沒有「項目被選取」的事件,所以你想要使用 DBGrid 的多選機制來做這件事情,是有困難的
您可以參考一下 這一篇 以及 這一篇

再說,DBGrid 的多選機制真的是難用到爆,Ctrl 要按住不說,選取的標記又是小之又小,還是早早換掉為好啊
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-04-25 14:16:00 IP:220.228.xxx.xxx 訂閱
控制是一回事,操作方便是一回事
您想要的需求,是當多選點選時,如不合條件,就取消當筆的選取
但是請問您要用什麼方式通知使用者「不合條件」?ShowMessage?還是其他方式?
如果沒有適當的方式通知使用者「不合條件」,使用者只會看見「我不能選這一筆」而不知道為什麼,於是你將會接到抱怨的電話
如果通知的方式不好,一旦觸發了 DBGrid 取消選取的條件,剛才使用者選好的那些紀錄統統都取消選取了,你還是會接到抱怨的電話

如果你只是想知道有沒有方法可以控制,有一個點你可以試試看:DBGrid.SelectedRows.CurrentRowSelected

===================引 用 rita.i880 文 章===================
謝謝你的提供的方式,
dbgrid 確實不是很方便, 但難道沒有其他的方式以對dbgrid 做控制了嗎 ?

------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
rita.i880
一般會員


發表:19
回覆:35
積分:10
註冊:2007-07-23

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-04-25 14:54:01 IP:59.125.xxx.xxx 未訂閱

謝謝你的指教, 這樣的控管純粹是程式防呆用的,
再請教一下, dbgrid 某一筆被選取時, 會觸發那個事件呢?
或者由那個地方可以知道此筆資料被選取了呢?


===================引 用 sryang 文 章===================
控制是一回事,操作方便是一回事
您想要的需求,是當多選點選時,如不合條件,就取消當筆的選取
但是請問您要用什麼方式通知使用者「不合條件」?ShowMessage?還是其他方式?
如果沒有適當的方式通知使用者「不合條件」,使用者只會看見「我不能選這一筆」而不知道為什麼,於是你將會接到抱怨的電話
如果通知的方式不好,一旦觸發了 DBGrid 取消選取的條件,剛才使用者選好的那些紀錄統統都取消選取了,你還是會接到抱怨的電話

如果你只是想知道有沒有方法可以控制,有一個點你可以試試看:DBGrid.SelectedRows.CurrentRowSelected

sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#6 引用回覆 回覆 發表時間:2011-04-25 15:39:37 IP:220.228.xxx.xxx 訂閱
被選取是沒有事件的,所以我才說很麻煩
不過,被選取總是要用滑鼠去按,所以你可以試試看 CellClick
判斷目前列有沒有被選,就是 DBGrid.SelectedRows.CurrentRowSelected
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
rita.i880
一般會員


發表:19
回覆:35
積分:10
註冊:2007-07-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2011-04-25 16:27:36 IP:59.125.xxx.xxx 未訂閱

嗯!!
瞭解了, 謝謝你!!

===================引 用 sryang 文 章===================
被選取是沒有事件的,所以我才說很麻煩
不過,被選取總是要用滑鼠去按,所以你可以試試看 CellClick
判斷目前列有沒有被選,就是 DBGrid.SelectedRows.CurrentRowSelected
cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#8 引用回覆 回覆 發表時間:2011-04-26 17:48:52 IP:220.128.xxx.xxx 未訂閱
已結案,還是聊一下。
我的做法是,資料表開一個叫做 [選取] 的 bit 欄位(資料庫是 Sql Server),選取畫面的 TAdoDataSet 的 LockType 用 ltBatchOptimistic,在 TDBGrid 上面按兩下,就可以在 [選取和取消選取] 之間切換,也可以改為用右鍵單點來切換,另外有 "全選" 和 "全不選" 兩個按鈕。

在 BeforePost 處理決定能不能被選取

if DataSet.FieldByName('選取').AsBoolean then // 表示剛選取了
begin
if DataSet.FieldByName('核准').AsBoolean = false then
begin
ShowMessage('未經核准不允許選取');
DataSet.Edit;
DataSet.FieldByName('選取').AsBoolean := false;
DataSet.Post;
end;
end;
// 不可以直接處理 DataSet 的欄位,必須另外用一個 DataSet 讀進來處理,不然變成要呼叫 UpdateBatch(arAll),多人環境會產生衝突。
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#9 引用回覆 回覆 發表時間:2011-04-26 18:03:16 IP:220.228.xxx.xxx 訂閱
cancer 網友的作法,搭配上 TCheckDBGrid 就更好用了,直接顯示一個勾選欄位表示有沒有選擇到
請參照 2 樓的兩個超連結
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#10 引用回覆 回覆 發表時間:2011-04-27 16:15:15 IP:220.128.xxx.xxx 未訂閱
我最怕使用第三方元件,都使用公司的元件或標準元件,第三方元件除非有附原始碼,否則 Delphi 一昇級,元件沒有原始碼可以重 Build,就不能用了。
===================引 用 sryang 文 章===================
cancer 網友的作法,搭配上 TCheckDBGrid 就更好用了,直接顯示一個勾選欄位表示有沒有選擇到
請參照 2 樓的兩個超連結
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#11 引用回覆 回覆 發表時間:2011-04-27 16:28:10 IP:220.228.xxx.xxx 訂閱
是啊,所以那個 TCheckDBGrid 是有原始碼的,cancer 網友可以考慮一下把勾選功能加入公司元件裡面
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#12 引用回覆 回覆 發表時間:2011-04-27 20:11:34 IP:220.128.xxx.xxx 未訂閱
您好,有原始碼真好,請問,TCheckDBGrid 的 Check Field 是不需要資料表本身有對應 Boolean 欄位的嗎?
公司的 DBGrid 元件是前人開發的,異常複雜,全部沒有註解,我也無法修改,功能包括
1.欄位設定視窗:可以讓使用者新增、刪除欄位,可以記起來供下次載入。
2.一律按 Enter 往右移動,有設定可以選擇按 Enter 要往下還是往右。
3.進入布林欄位,按 Enter 切換 true 和 false。
因為太複雜所以有臭蟲,我不敢改。我自己從網路下載了一個簡單的改良 TDBGrid 元件,以彌補 TDBGrid 沒有 CheckColumn 的嚴重缺點,但資料庫必須有一個對應的 Boolean 欄位,這個改天可以試改看看。
請問,TCheckDBGrid 哪裡下載?
===================引 用 sryang 文 章===================
是啊,所以那個 TCheckDBGrid 是有原始碼的,cancer 網友可以考慮一下把勾選功能加入公司元件裡面
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#13 引用回覆 回覆 發表時間:2011-04-27 22:04:48 IP:114.35.xxx.xxx 訂閱
原始程式碼下載跟使用範例就在 2 樓的兩個超連結上啊
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
系統時間:2024-11-25 19:53:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!