两个combobox如何传递参数,做成二级关联下拉菜单 |
答題得分者是:eaglewolf
|
nanpiao
一般會員 發表:12 回覆:18 積分:6 註冊:2007-10-19 發送簡訊給我 |
有两个相关联的表:provinceinfo和cityinfo
provinceinfo表数据和字段如下: pid pname 11 北京市 21 辽宁省 22 吉林省 cityinfo表数据和字段如下: pid cid cname 11 1101 北京市 21 2101 沈阳市 21 2102 大连市 21 2103 鞍山市 22 2201 长春市 22 2202 吉林市 22 2203 四平市 程序要求: 当在第一个下拉菜单选择辽宁省或者吉林省,不知道如何将辽宁省(id为21)或者吉林省(id为22)的相应的id传递给第二个combobox,另外第一个combobox 的events 选择什么,最后如何保存时为对应的id,也就是保存时,存的代码 :如 选择的辽宁省沈阳市, 保存是其对应的代码 21 和2101 启动窗体后,我程序如下,之后combobox1 和combobox2不知道如何编写了 with adoquery1 do begin close; sql.Clear; sql.Add('select * from provinceinfo' ); open; First; for i:=0 to RecordCount-1 do begin ComboBox1.Items.Add(FieldbyName('pname').AsString); Next; end; Close; end; |
st33chen
尊榮會員 發表:15 回覆:591 積分:1201 註冊:2005-09-30 發送簡訊給我 |
您好,
我認為 用 DBLookupComboBox 或 dbgrid 比較快, 參考一下: 1. 新建一個 form 2. 各拉一個 query1, datasource1, dbgrid1 dbgrid1.datasource := datasource1; datasource1.dataset := query1; query1.sql.text := 'select * from provinceinfo'; 3. 各拉一個 query2, datasource2, dbgrid2 dbgrid2.datasource := datasource2; datasource2.dataset := query2; query2.datasource := datasource1; <-- 重點 query2.sql.text := 'select * from cityinfo where pid = :pid'; <-- 重點 執行即可, 元件本身會處理有關連結, 傳參數 的問題. dbgrid 換成 DBLookupComboBox 也可以, 但可能需要微調一下. 至於 "最后如何保存时为对应的id,也就是保存时,存的代码 :如 选择的辽宁省沈阳市, 保存是其对应的代码 21 和2101" 不太了解問題, 您要保存到哪裡? ===================引 用 nanpiao 文 章=================== 有两个相关联的表:provinceinfo和cityinfo provinceinfo表数据和字段如下: pid pname 11 北京市 21 辽宁省 22 吉林省 cityinfo表数据和字段如下: pid cid cname 11 1101 北京市 21 2101 沈阳市 21 2102 大连市 21 2103 鞍山市 22 2201 长春市 22 2202 吉林市 22 2203 四平市 程序要求: 当在第一个下拉菜单选择辽宁省或者吉林省,不知道如何将辽宁省(id为21)或者吉林省(id为22)的相应的id传递给第二个combobox,另外第一个combobox 的events 选择什么,最后如何保存时为对应的id,也就是保存时,存的代码 :如 选择的辽宁省沈阳市, 保存是其对应的代码 21 和2101 启动窗体后,我程序如下,之后combobox1 和combobox2不知道如何编写了 with adoquery1 do begin close; sql.Clear; sql.Add('select * from provinceinfo' ); open; First; for i:=0 to RecordCount-1 do begin ComboBox1.Items.Add(FieldbyName('pname').AsString); Next; end; Close; end;
------
IS IT WHAT IT IS 我是 李慕白 請倒著唸. 又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦); 都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
編輯記錄
st33chen 重新編輯於 2008-10-22 14:01:02, 註解 無‧
|
pceyes
尊榮會員 發表:70 回覆:657 積分:1140 註冊:2003-03-13 發送簡訊給我 |
===================引 用 st33chen 文 章=================== 至於 "最后如何保存时为对应的id,也就是保存时,存的代码 :如 选择的辽宁省沈阳市, 保存是其对应的代码 21 和2101" 不太了解問題, 您要保存到哪裡? st33chen 寫得實在太好了,本人佩服, 另一個問題由我來答,只要設二個全域變數sPid , sCid來存使者所選的該筆資料即可。 sPid := query2.fieldbyname('pid').asstring; sCid := query2.fieldbyname('cid').asstring;
------
努力會更接近成功 |
nanpiao
一般會員 發表:12 回覆:18 積分:6 註冊:2007-10-19 發送簡訊給我 |
st33chen 的 dbgrid 我已经试验出来,很好.同时也感谢pceyes理解我保存数据id 的含义.因为二级关联菜单内容还要保存到数据库中.我还要试验一下DBLookupComboBox是否可以.最后还是想通过adoconnection,adoquery,datasource,combobox 物件进行二级关联.这样不知道provinceinfo的表中的pid,以及cityinfo的cid如何传递.pceyes提出方法
sPid := query2.fieldbyname('pid').asstring; sCid := query2.fieldbyname('cid').asstring; 但是不明白当选择combobox一个选择项时,如何下一个下拉菜单的关联.能否写出代码.多谢各位大大. |
st33chen
尊榮會員 發表:15 回覆:591 積分:1201 註冊:2005-09-30 發送簡訊給我 |
一般的做法是
combobox 的 onchange 事件 query2.close; query2.sql.text := 'select * from cityinfo where pid = ''' combobox.text '''' query2.open; 或是用參數型的 query2.close; query2.parambyname('pid').asstring :=combobox.text; query2.open; 其實, 和我提的前一個解法類似, 但既然 tquery 元件有提供 datasource 的功能, 不用白不用, 所以才推薦使用的. 參考一下 . ===================引 用 nanpiao 文 章=================== st33chen 的 dbgrid 我已经试验出来,很好.同时也感谢pceyes理解我保存数据id 的含义.因为二级关联菜单内容还要保存到数据库中.我还要试验一下DBLookupComboBox是否可以.最后还是想通过adoconnection,adoquery,datasource,combobox 物件进行二级关联.这样不知道provinceinfo的表中的pid,以及cityinfo的cid如何传递.pceyes提出方法 sPid := query2.fieldbyname('pid').asstring; sCid := query2.fieldbyname('cid').asstring; 但是不明白当选择combobox一个选择项时,如何下一个下拉菜单的关联.能否写出代码.多谢各位大大.
------
IS IT WHAT IT IS 我是 李慕白 請倒著唸. 又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦); 都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲. |
eaglewolf
資深會員 發表:4 回覆:268 積分:429 註冊:2006-07-06 發送簡訊給我 |
如果一定要用combobox
最簡單的方法是把ID跟name一起顯示在 combobox中 comboBox1.Add(adoquery1.FieldByName('pid').AsString ' ' adoquery1.FieldByName('pname').AsString); ******************************************************************************************** 另外提供一個思考方向 自訂一個Class [code delphi] type TID = class f_ID:string; public constructor Creator(id:string); property ID :string read f_ID; end; constructor TID.Creator(id: string); begin f_ID:=id; end; procedure TForm1.FormCreate(Sender: TObject); begin .....略..... while not adoQuery1.Eof do begin comboBox1.AddItem(adoquery1.FieldByName('pname').AsString, TID.Create(adoquery1.FieldByName('pid').AsString)); adoQuery1.Next; end; .....略..... end; procedure TForm1.ComboBox1Change(Sender: TObject); begin sPID := (TID(comboBox1.Items.Objects[comboBox1.ItemIndex]).ID); comboBox2.Items.Clear; .....略..... while not adoQuery2.Eof do begin comboBox2.AddItem(adoquery2.FieldByName('cname').AsString, TID.Create(adoquery2.FieldByName('cid').AsString)); adoQuery2.Next; end; .....略..... end; procedure TForm1.ComboBox2Change(Sender: TObject); begin sCID := (TID(comboBox2.Items.Objects[comboBox2.ItemIndex]).ID); end; [/code] ===================引 用 nanpiao 文 章=================== st33chen 的 dbgrid 我已经试验出来,很好.同时也感谢pceyes理解我保存数据id 的含义.因为二级关联菜单内容还要保存到数据库中.我还要试验一下DBLookupComboBox是否可以.最后还是想通过adoconnection,adoquery,datasource,combobox 物件进行二级关联.这样不知道provinceinfo的表中的pid,以及cityinfo的cid如何传递.pceyes提出方法 sPid := query2.fieldbyname('pid').asstring; sCid := query2.fieldbyname('cid').asstring; 但是不明白当选择combobox一个选择项时,如何下一个下拉菜单的关联.能否写出代码.多谢各位大大.
------
先查HELP 再查GOOGLE 最後才發問 沒人有義務替你解答問題 在標題或文章中標明很急 並不會增加網友回答速度 Developing Tool: 1.Delphi 6 2.Visual Studio 2005 3.Visual Studio 2008 DBMS: MS-SQL |
nanpiao
一般會員 發表:12 回覆:18 積分:6 註冊:2007-10-19 發送簡訊給我 |
谢谢,我使用了你推荐的
最簡單的方法是把ID跟name一起顯示在 combobox中 comboBox1.Add(adoquery1.FieldByName('pid').AsString ' ' adoquery1.FieldByName('pname').AsString); 另一个思路有些看不懂.谢谢. ===================引 用 eaglewolf 文 章=================== 如果一定要用combobox 最簡單的方法是把ID跟name一起顯示在 combobox中 comboBox1.Add(adoquery1.FieldByName('pid').AsString ' ' adoquery1.FieldByName('pname').AsString); ******************************************************************************************** 另外提供一個思考方向 自訂一個Class [code delphi] type TID = class f_ID:string; public constructor Creator(id:string); property ID :string read f_ID; end; constructor TID.Creator(id: string); begin f_ID:=id; end; procedure TForm1.FormCreate(Sender: TObject); begin .....略..... while not adoQuery1.Eof do begin comboBox1.AddItem(adoquery1.FieldByName('pname').AsString, TID.Create(adoquery1.FieldByName('pid').AsString)); adoQuery1.Next; end; .....略..... end; procedure TForm1.ComboBox1Change(Sender: TObject); begin sPID := (TID(comboBox1.Items.Objects[comboBox1.ItemIndex]).ID); comboBox2.Items.Clear; .....略..... while not adoQuery2.Eof do begin comboBox2.AddItem(adoquery2.FieldByName('cname').AsString, TID.Create(adoquery2.FieldByName('cid').AsString)); adoQuery2.Next; end; .....略..... end; procedure TForm1.ComboBox2Change(Sender: TObject); begin sCID := (TID(comboBox2.Items.Objects[comboBox2.ItemIndex]).ID); end; [/code] ===================引 用 nanpiao 文 章=================== st33chen 的 dbgrid 我已经试验出来,很好.同时也感谢pceyes理解我保存数据id 的含义.因为二级关联菜单内容还要保存到数据库中.我还要试验一下DBLookupComboBox是否可以.最后还是想通过adoconnection,adoquery,datasource,combobox 物件进行二级关联.这样不知道provinceinfo的表中的pid,以及cityinfo的cid如何传递.pceyes提出方法 sPid := query2.fieldbyname('pid').asstring; sCid := query2.fieldbyname('cid').asstring; 但是不明白当选择combobox一个选择项时,如何下一个下拉菜单的关联.能否写出代码.多谢各位大大. |
nanpiao
一般會員 發表:12 回覆:18 積分:6 註冊:2007-10-19 發送簡訊給我 |
谢谢,我使用你推荐的combobox 的 onchange 事件 ,使用了 eaglewolf的最簡單的方法是把ID跟name一起顯示在 combobox中
===================引 用 st33chen 文 章=================== 一般的做法是 combobox 的 onchange 事件 query2.close; query2.sql.text := 'select * from cityinfo where pid = ''' combobox.text '''' query2.open; 或是用參數型的 query2.close; query2.parambyname('pid').asstring :=combobox.text; query2.open; 其實, 和我提的前一個解法類似, 但既然 tquery 元件有提供 datasource 的功能, 不用白不用, 所以才推薦使用的. 參考一下 . ===================引 用 nanpiao 文 章=================== st33chen 的 dbgrid 我已经试验出来,很好.同时也感谢pceyes理解我保存数据id 的含义.因为二级关联菜单内容还要保存到数据库中.我还要试验一下DBLookupComboBox是否可以.最后还是想通过adoconnection,adoquery,datasource,combobox 物件进行二级关联.这样不知道provinceinfo的表中的pid,以及cityinfo的cid如何传递.pceyes提出方法 sPid := query2.fieldbyname('pid').asstring; sCid := query2.fieldbyname('cid').asstring; 但是不明白当选择combobox一个选择项时,如何下一个下拉菜单的关联.能否写出代码.多谢各位大大. |
nanpiao
一般會員 發表:12 回覆:18 積分:6 註冊:2007-10-19 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |