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

如何讓DBGrid只顯示被選取的資料??

尚未結案
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-21 09:47:08 IP:61.220.xxx.xxx 未訂閱
小弟是用ADOQuery搭配DBGrid,但DBGrid可以被多筆選取,如何在多筆選取後,DBGrid只顯示被選取的資料ㄋ??
------
ivankuo
T.J.B
版主


發表:29
回覆:532
積分:497
註冊:2002-08-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-21 10:08:49 IP:61.220.xxx.xxx 未訂閱
你可以參考一下 你可以再放一個adoquery 然後寫一個function把多筆選取的值 傳回給adoquery 然後下sql 應該就可以了 天行健 君子當自強不息~~@.@
------
天行健
君子當自強不息~~@.@
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-21 10:35:13 IP:61.220.xxx.xxx 未訂閱
前輩, 您的意思是在使用另一個query,這樣是不是要再建立一個相同的table來存放阿??如果是這樣的話,這樣table會很多耶??還是我誤解了??
------
ivankuo
pedro
尊榮會員


發表:152
回覆:1187
積分:892
註冊:2002-06-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-05-21 11:56:02 IP:210.61.xxx.xxx 未訂閱
把另一個query1的sql語法table指向同一個
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-05-21 15:49:15 IP:61.221.xxx.xxx 未訂閱
引言: 把另一個query1的sql語法table指向同一個
那這樣要如何過濾被選的資料ㄋ??
------
ivankuo
tech_state
版主


發表:44
回覆:638
積分:641
註冊:2003-02-10

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-05-22 12:02:42 IP:61.221.xxx.xxx 未訂閱
ivankuo, 您好 我想T.J.B版主的意思是說, 您增加一個adoquery元件, 然後將您選擇後的資料再由第二個adoquery元件在重新過濾一次, 最後再將DBGrid元件的DataSet指向第二個adoquery元件。 試試看!    ======================= 涵養怒中氣。謹防順口言。留心忙裡錯。珍惜有時錢。 是非終日有,不聽自然無 天下本無事,庸人自擾之
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-05-22 12:11:47 IP:61.221.xxx.xxx 未訂閱
那過濾的方式是要紀錄這些被selected的key values,再傳入另一個query當作where 條件ㄇ?? 小弟有看到一個FilterOnBookmarks的方法,但是try不出來怎用??
------
ivankuo
channel
尊榮會員


發表:67
回覆:707
積分:854
註冊:2002-05-02

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-05-22 12:43:22 IP:211.21.xxx.xxx 未訂閱
引言: 那過濾的方式是要紀錄這些被selected的key values,再傳入另一個query當作where 條件ㄇ??是的 小弟有看到一個FilterOnBookmarks的方法,但是try不出來怎用??
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  I:  Integer;
  Str: string;
begin
  Str := '';
  if DBGrid1.SelectedRows.Count > 0 then
  begin
    with DBGrid1.DataSource.DataSet do
      for I := 0 to DBGrid1.SelectedRows.Count-1 do
      begin
        GotoBookmark(pointer(DBGrid1.SelectedRows.Items[I]));
        if I > 0 then
          Str := Str ', ';
        Str:= Str #39 FieldByName('KeyField').AsString #39;
      end;
    with Query2 do//另一Query
    begin
      Close;
      SQL.Clear;
      SQL.Add('Select * From TableName Where KeyField in (' Str ')');
      Open;
    end;
  end;
end;
~小弟淺見,參考看看~ 發表人 - channel 於 2003/05/22 12:46:02
------
~小弟淺見,參考看看~
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-05-23 09:34:30 IP:61.221.xxx.xxx 未訂閱
感謝前輩,我之前也只有想到這個方法,但嫌麻煩,不知還有其他可行的方式,因為這樣如果user點了一大推資料的話,where 條件就很長很長,不知還有其他更好的方式ㄋ
------
ivankuo
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-05-23 09:35:17 IP:61.221.xxx.xxx 未訂閱
感謝前輩,我之前也只有想到這個方法,但嫌麻煩,不知還有其他可行的方式,因為這樣如果user點了一大推資料的話,where 條件就很長很長,不知還有其他更好的方式ㄋ
------
ivankuo
channel
尊榮會員


發表:67
回覆:707
積分:854
註冊:2002-05-02

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-05-23 09:50:40 IP:211.21.xxx.xxx 未訂閱
引言: 感謝前輩,我之前也只有想到這個方法,但嫌麻煩,不知還有其他可行的方式,因為這樣如果user點了一大推資料的話,where 條件就很長很長,不知還有其他更好的方式ㄋ
小弟認為這是無法避免的,應該只有這種方式吧!請各位前輩、先進賜教! ~小弟淺見,參考看看~
------
~小弟淺見,參考看看~
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-05-23 11:43:05 IP:218.16.xxx.xxx 未訂閱
var
  x: Integer;
  BMList: array of TVarRec;
begin
  SetLength(BMList, smdbgrid1.SelectedRows.Count);
  for X:=0 to smdbgrid1.SelectedRows.Count - 1 do
  begin
    BMList[x].VType := vtPointer;
    BMList[x].VPointer := Pointer(smdbgrid1.SelectedRows[x]);
  end;
  bds1.FilterOnBookmarks(BMList);
end;
originally posted by Lieven Keersmaekers in http://groups.google.com/groups?hl=zh-TW&lr=lang_zh-CN|lang_zh-TW|lang_en&ie=UTF-8&oe=UTF-8&selm=3d2ac8fb_1%40dnews
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-05-23 11:53:03 IP:61.221.xxx.xxx 未訂閱
感謝Justmade前輩,你的方式可以了,只是我自己也在try,確有問題 var i:integer; book:array of TBookmarkStr; begin SetLength(book,DBGrid1.SelectedRows.Count); for i:=0 to DBGrid1.SelectedRows.Count-1 do begin query1.GotoBookmark(pointer(DBGrid1.SelectedRows.Items[i])); book[i]:=Query1.Bookmark; end; Query1.FilterOnBookmarks([book]); //此行會有錯誤 end;
------
ivankuo
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-05-23 12:59:42 IP:218.16.xxx.xxx 未訂閱
這是因為 Bookmarks 的定義是 array of const 而不是 array of TBookmarkStr : procedure FilterOnBookmarks(Bookmarks: array of const); 而根據 Help 中 "Variant open array parameters" 中說明 : The array of const construction is equivalent to array of TVarRec. TVarRec, declared in the System unit, represents a record with a variant part that can hold values of integer, Boolean, character, real, string, pointer, class, class reference, interface, and variant types. TVarRec's VType field indicates the type of each element in the array. Some types are passed as pointers rather than values; in particular, long strings are passed as Pointer and must be typecast to string. 所以要成功的使用 FilterOnBookmarks, 一就是 : Query1.FilterOnBookmarks([BookMark1,BookMark2,BookMark3,..]) 但這只能靜態的寫死 若要動態的建立便要使用 array of TVarRec; 我看完 Help 後也不是很肯定應甚樣做,我沒使用 ADO 所以便上網找找資料轉貼給你了。
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-05-23 13:03:27 IP:61.221.xxx.xxx 未訂閱
感謝前輩,我查了help已經了解TVarRec的用法,非常感謝
------
ivankuo
系統時間:2024-05-18 22:38:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!