在PowerBuilder中使用两个值填充下拉列表框(DDLB)

时间:2013-06-14 12:22:22

标签: string drop-down-menu powerbuilder

我在我的窗口中创建了一个下拉列表框(DDLB)(我正在使用PowerBuilder 10.5)。一旦我打电话给我的功能,DDLB就会填满我桌子上的所有不同城市。这是我用过的代码:

FOR li_i=1 TO ii_br_red
ls_city = dw_city.GetItemString(li_i, 'city')
IF ddlb_city.FindItem(ls_city, 1) = -1 THEN 
ddlb_city.AddItem(ls_city) END IF; NEXT

代码的下一部分是在ddlb“selectionchanged”事件中......

 dw_city.SetFilter("city = '" + this.text + "'")
 dw_city.Filter()

这很好用,在调用我的函数后(通过点击一个命令按钮)我会得到一张表格中列出的所有不同的城市,例如。

Paris
London
New York
Washington

没有城镇会被列入两次。 我现在需要做的是在我的DDLB中的每个城市旁边添加一个国家/地区。所以在点击我的命令按钮后,我会在我的DDLB中得到这个:

Paris (France)
London (GB)
New York (USA)
Washington (USA)

有什么建议吗?提前谢谢......

第二个问题,类似于这个主题:我有一个SQL代码:

SELECT distinct name FROM table1;

这给了我8个不同的名字。我想要做的是用这些名称填充另一个DDLB,ddlb_1,但这必须发生在我的程序的open事件中。这就是我在程序的公开活动中写的:

string ls_name
SELECT distinct name INTO :ls_name FROM tabel1;
ddlb_1.AddItem(ls_name)

但这只给了我第一个名字。我猜我需要一些计数,但我不能把它拉下来。

5 个答案:

答案 0 :(得分:2)

如果您不想更改程序的设计,并且当您声明该国家/地区属于同一个DW时,您可以稍微破解代码以将国家/地区添加到ddlb(我想该国家/地区是可以在dw的同一行获得:

String ls_country
FOR li_i=1 TO ii_br_red
    ls_city = dw_city.GetItemString(li_i, 'city')
    IF ddlb_city.FindItem(ls_city, 1) = -1 THEN 
        ls_country = dw_city.GetItemString(li_i, 'country')
        ddlb_city.AddItem(ls_city + ' (' + ls_country + ')')
    END IF
NEXT

快速而肮脏的黑客攻击事件中的值以过滤DW将是

int p
string ls_city

ls_city = this.text
p = pos(ls_city, '(')
if p > 0 then ls_city = left(ls_city, p - 2) //skip the "space + (country)" part
dw_city.SetFilter("city = '" + ls_city + "'")
dw_city.Filter()

但是这种代码难以维护,应该被其他代码替换,因为城市价值的处理与其在列表中的表示强烈耦合。

更好的解决方案是dropdowndatawindow,或者(更糟糕的)一系列城市名称,其中ddlb中的城市+国家/地区的索引将对应于适合过滤DW的裸城名称的索引

答案 1 :(得分:0)

我认为你应该修改“source”数据窗口'select,你应该得到你想要的最终结果,你只需要将数据从数据窗口复制到ddlb。你应该在选择这样的东西时使用distinct:

select distinct city + ' (' + country_code + ')' from cities_and_countries_table

当然你应该将“city”,“country_code”替换为表中的实际列名以及表名。有了这个,您将只获得每个城市一次,并且它们已经与国家代码连接在一起。

溴。的Gabor

答案 2 :(得分:0)

它真的必须是DDLB吗?我会为用户提供城市名称的单行编辑,并在用户输入时过滤DW。

答案 3 :(得分:0)

要回答我自己的第二个问题,这就是我最终完成它的方式......

String ls_name
DECLARE xy CURSOR FOR
SELECT distinct name FROM table1;
OPEN xy;
FETCH xy INTO :ls_name;
do until sqlca.sqlcode <> 0
ddlb_1.AddItem(ls_name);
FETCH xyINTO :ls_name;
loop
CLOSE xy;

答案 4 :(得分:0)

我是PowerBuilder的新手,但我只是使用了那种场景,但是我使用的是DDW(下拉数据窗口)而不是列表框在这种情况下,你可以尽快显示多个列DW获得焦点,您将能够动态填充数据。试试看。这对我来说很有用,当你刚开始的时候(就我的情况而言),DW是痛苦的,但你可以用它做很多事情