hur.cn - 华软网

 热门搜索

算了,还是在这个小版块出100分来求助:级联下拉列表的问题!

  作者:未知    来源:网络    更新时间:2017/12/5
两个下拉列表都是从同一数据表中取出数据
其中第一个下拉列表取出YXSDM,YXMC,但只显示YXMC;
当第一个下拉列表改变时,第二个下拉列表根据第一个下拉列表的YXSDM的值,选出这个YXSDM中对应的ZYDM,ZYMC值,但只显示ZYMC

求解决方案,谢谢!

------华软网友回答------
itemchanged事件

动态修改datawindowchild的

dataobject
------华软网友回复------
谢谢 hygougou(狗狗) 

我需要比较详细的代码呵呵
------华软网友回复------
用同一个表,建立两个用于子数据窗口数据窗口
第一个选中YXSDM,YXMC,两个字段,隐藏YXSDM
第二个选中ZYDM,ZYMC,YXSDM,隐藏YXSDM,ZYDM

itemchanged 事件

DataWindowChild ldwc_child1,ldwc_child2

String ls_YXSDM

Choose Case dwo.name

   Case 'YXMC'//第一个下拉数据窗口所在的字段
      
       dw_1.GetChild('YXMC',ldwc_child1)

       ldwc_child1.SetTransObject(SQLCA)
       ldwc_child1.Retrieve()

       ls_YXSDM = ldwc_child1.GetItemString('YXSDM',ldwc_child1.GetRow())

       dw_1.GetChild("ZYMC",ldwc_child2)

       ldwc_child2.SetTransObject(SQLCA)
       ldwc_child2.Retrieve()
       ldwc_child2.SetFilter("YXSDM = '" + ls_YXSDM + "'")
       ldwc_child2.Filter()

END CHOOSE

------华软网友回复------
在选择第一个下拉列表的时候,第二个下拉列表就会自动过滤。不知道试不是这个意思
------华软网友回复------
建议不要这样做,有隐藏的BUG,建议第二个列不要用下拉数据窗口,值用SQL选出,然后赋值。
------华软网友回复------
luotitan(泰坦) :

但是第二个列也是要供选择的呀并且要受第一个的限制
------华软网友回复------
这是个老问题,以前的帖子我也提到过,我的解决方法是弹出一个选择窗口。
------华软网友回复------
luotitan(泰坦) 

你的那个贴子在哪儿???
说说你的办法?
------华软网友回复------
我给你提供另一种思路:使用两个下拉列表框控件,然后使用两个数据存储对象来得到表中的值,逐条插入到列表框控件中,那首先你就要建立两个数据窗口对象,d_1中第一个选中YXSDM,YXMC,两个字段,d_2中第二个选中ZYDM,ZYMC,YXSDM为参数。在第一个下拉控件的Selectionchanged事件中得到当前选择的值,赋给实例变量,作为下一个列表控件的参数,动态改变第二个下拉列表框下的数据。
一时想起的,可能有些不完善啊!嘿嘿


------华软网友回复------
呵呵,继续等待中,期待其它解决方案!


难道大家都没有遇到这种情况这种要求吗?
------华软网友回复------
第一个DW的constructor的脚本:
settrans(sqlca)
retrieve()

if rowcount() > 0 then
datawindowChild ldw_child
dw_2.settrans(sqlca)
dw_2.retrieve(getitemstring(1,1))

If dw_ucsub.getchild ("*****",ldw_child) <> 1 then  //****是第二个DW的下拉的列的 obj.name
messagebox("error","Not a datawindowChild!")
else
ldw_child.settrans(sqlca)
ldw_child.retrieve(getitemstring(1,1))
end if
end if

第一个DW的itemchanged的脚本:
accepttext ()
if rowcount() > 0 then
datawindowChild ldw_child
dw_ucsub.settrans(sqlca)
dw_ucsub.retrieve(getitemstring(1,1))

If dw_ucsub.getchild ("*****",ldw_child) <> 1 then
messagebox("error","Not a datawindowChild!")
else
ldw_child.settrans(sqlca)
ldw_child.retrieve(getitemstring(1,1))
end if
end if

此外在第二个DW你要手动的insertrow一行,否则会跳出个参数输入匡的。
------华软网友回复------
第一个DW的constructor的脚本:
settrans(sqlca)
retrieve()

if rowcount() > 0 then
datawindowChild ldw_child
dw_2.settrans(sqlca)
dw_2.retrieve(getitemstring(1,1))  //就是你的YXSDM

If dw_2.getchild ("****",ldw_child) <> 1 then  //****是第二个DW的下拉的列的name
messagebox("error","Not a datawindowChild!")
else
ldw_child.settrans(sqlca)
ldw_child.retrieve(getitemstring(1,1))
end if
end if

第一个DW的itemchanged的脚本:
accepttext ()
if rowcount() > 0 then
datawindowChild ldw_child
dw_2.settrans(sqlca)
dw_2.retrieve(getitemstring(1,1))

If dw_2.getchild ("*****",ldw_child) <> 1 then
messagebox("error","Not a datawindowChild!")
else
ldw_child.settrans(sqlca)
ldw_child.retrieve(getitemstring(1,1))
end if
end if

此外在第二个DW你要手动的insertrow一行,否则会跳出个参数输入匡的。

------华软网友回复------
这样的界面设计不好
用户不知道你的两个下拉式列表的关联,直接点了第二个怎么办?
是否要判断用户操作的每种可能?
是否要判断输入数据的完整性?
这样会增加复杂度和出错的可能。
------华软网友回复------
herrick(寻找七七):

您说的问题确实存在,我也发现了这个问题,关键是现在没有其它比较完美的解决方案!
------华软网友回复------
难度加大,2个下拉列表关联,改为3个下拉列表关联(实际程序开发中用户需求)

望各路英雄尽显本色!分不够另外开贴,我还有448分可用,呵呵!
------华软网友回复------
不要用dw,可以吗?用游标很灵活阿
------华软网友回复------
限制第二个,第一个有了选择第二个才可以选择
------华软网友回复------
该成两个数据窗口不就完事了吗?
只要使用不就行了吗?
用下拉列表和数据窗口有区别吗?
------华软网友回复------
麻烦楼上的各位都说详细点好吗???

分不够我可以把其它分全部拿出来的!

有劳了!
------华软网友回复------
做完没事写了一个“二级联动”的例子,一定对你有帮助。
问题一:在数据窗口对象中实现二级联动效果。
数据窗口控件的名称为dw_1
列dept 列staffroom
二列的Edit编辑模式都是下拉数据窗口(DropDownDataWindow)方式。分别对应着d_dept和d_staffroom两个数据窗口对象。

d_dept 中选择表department,其中含有列(Int)dept_id,(String)dept_name
d_staffroom 中选择表staffroom,其中含有列(Int)staffroom_id,(Sting)staffroom_name,(Int)dept_id

d_staffrooom设置了检索参数 dept_id
select staffroom_id,staffroom_name 
from staffroom
where dept_id = :dept_id
using sqlca;

数据窗口对象中的dept列选择了d_dept数据窗口对象,值:dept_id,显示值:dept_name
数据窗口对象中的staffroom列选择了d_staffroom数据窗口对象,值:staffroom_id,显示值:staffroom_name

目的,选择dept列得到dept_id,当作列staffroom的动态参数

在数据窗口控件dw_1的Itemchanged事件中写上如下脚本:
String ls_columnname
Integer li_deptid,li_code

DataWindowchild staff_child

ls_columnname = dw_1.GetColumnname()
if ls_columnname = "dept" then
  li_deptid = dw_1.getItemNumber(row,dept)
  li_code = dw_1.GetChild("staffroom",staff_child)
  if li_code = -1 then Messagebox("错误","不是子数据窗口")
  CONNECT USING SQLCA;
  staff_child.SetTransObject(SQLCA)
  staff_child.Retrieve(li_deptid)
end if

问题二:实现窗口中两个ddlb下拉列表框(DropDownListBox)实现二级联动效果。
在窗口中声明实例变量 Integer ii_deptid
首先需要将数据库表中的数据检索出来逐条插入到ddlb_dept控件中。使用游标方式。
在窗口的open事件中写上如下脚本:
Declare dept Cursor for
select detp_name
from department
using sqlca;
open dept;
fetch dept into :dept_name;
while sqlca.sqlcode = 0
  ddlb_dept.Additem(dept_name)
  fetch dept into :dept_name;
loop
close dept;

第二步:在ddlb_dept的SelectionChanged事件中写上:
String ls_deptname

ls_deptname = this.text
select dept_id
into :ii_deptid
from department
where dept_name = ls_deptname
using sqlca;
 
第三步:在ddlb_staff的GetFocus事件中写上:
Declare staff Cursor for
select staffroom_name
from staffroom
where dept_id = ii_deptid
using sqlca;
open staff;
fetch staff into :staffroom_name;
while sqlca.sqlcode = 0
  ddlb_staff.Additem(staffroom_name)
  fetch staff into :staffroom_name;
loop
close staff;      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。