怎样准确取得下拉数据窗口的行号

本文介绍了一种在下拉数据窗口中选择行后获取该行行号的方法,利用datawindow的find函数来重新定位已选择行的具体位置。

在下拉数据窗口选择行之后,想获取该行的其他列的值,那么就必须的获取选择行的行号
当选择行了之后,editchanged事件data的参数就是该行选择值,那么就可以通过data的值去重新定位
其该行的行号,可以使用datawindow的find的函数。
<think>好的,我现在需要帮助用户解决在PowerBuilder中获取数据窗口选中行号的问题。用户提到的是如何获取selected row number,所以首先我应该回忆PowerBuilder中相关的函数和方法。 首先,我记得PowerBuilder的数据窗口控件有几个用于处理选中行的函数。比如GetSelectedRow,这个函数可以获取指定行之后的第一个选中行。但用户可能想要的是当前选中的行,或者所有选中的行号。 根据引用内容,用户之前提到过使用SelectRow函数来改变选中行的外观,并且在引用[2]中提到了在rowfocuschanged事件中使用selectRow来高亮当前行。这可能意味着用户的数据窗口支持单行选择,或者是多行选择的情况。 接下来,我需要确定如何获取选中的行号。对于单行选择的情况,通常可以使用CurrentRow属性或者GetRow函数来获取当前焦点所在的行。但是如果是多行选择,可能需要遍历所有行检查是否被选中。 根据引用中的示例,用户可能在数据窗口中使用了一个flag字段来标记选中状态,通过修改这个字段的值来处理多选。这种情况下,可能需要通过查找flag字段的值来获取选中的行号。但用户的问题更偏向于使用内置的PowerBuilder方法,而不是自定义的字段。 回到内置函数,GetSelectedRow函数可以返回从指定行之后第一个被选中的行号。如果从第0行开始查找,第一次调用会返回第一个选中的行,然后继续调用直到返回0为止,这样可以收集所有选中的行号。例如: long ll_start = 0 long ll_selected do ll_selected = dw_1.GetSelectedRow(ll_start) if ll_selected > 0 then // 处理选中的行 ll_start = ll_selected end if loop while ll_selected > 0 另外,用户可能需要当前选中的行,这时可以使用GetRow函数,或者检查数据窗口的CurrentRow属性。不过,CurrentRow可能只是当前焦点所在的行,不一定是通过SelectRow选中的行,特别是在多选的情况下。 根据引用[2]中的代码,在rowfocuschanged事件中,使用selectRow来高亮当前行,这可能是将当前行设置为选中状态。因此,在这种情况下,选中的行号可能等同于当前行号,可以通过dw_1.GetRow()获取。 但是,用户的问题明确提到“selected row number”,可能需要区分单选和多选的情况。如果是单选,GetSelectedRow(0)会返回选中的行号;如果是多选,则需要循环获取所有选中的行。 另外,用户可能在数据窗口中使用了不同的方法来处理选中行的外观,如引用[1]中提到的通过计算字段flag来标记选中状态。这时,获取选中的行可能需要遍历数据窗口的每一行,检查flag字段的值是否为1。例如: long ll_row for ll_row = 1 to dw_1.RowCount() if dw_1.Object.flag[ll_row] = 1 then // 该行被选中 end if next 但用户的问题更倾向于使用PowerBuilder内置的方法,而不是自定义字段。因此,应优先推荐使用GetSelectedRow函数。 总结可能的解决方案: 1. 使用GetSelectedRow函数循环获取所有选中的行号。 2. 如果是单选,可以直接使用GetSelectedRow(0)获取第一个选中的行号。 3. 如果用户通过CurrentRow来跟踪选中行,可以结合GetRow()获取当前行号。 4. 如果使用了自定义的字段如flag,则需要遍历行检查该字段的值。 用户的需求是获取选中的行号,所以需要明确回答使用哪种方法。根据引用中的内容,用户可能在处理选中行时同时使用了SelectRow函数和自定义的flag字段,但问题更关注如何用内置方法获取。 因此,正确的回答应该是推荐使用GetSelectedRow函数,并说明如何处理单选和多选的情况,同时提到可能的自定义字段方法作为补充。</think>在PowerBuilder中获取数据窗口选中行号的方法主要有以下两种实现方式: ### 方法一:使用GetSelectedRow()函数(系统内置方法) ```powerbuilder // 获取第一个选中行 long ll_selected_row = dw_1.GetSelectedRow(0) // 获取所有选中行(适用于多选) long ll_start = 0 DO WHILE TRUE ll_selected_row = dw_1.GetSelectedRow(ll_start) IF ll_selected_row < 1 THEN EXIT // 这里处理选中行逻辑 MessageBox("选中行", "行号:" + String(ll_selected_row)) ll_start = ll_selected_row LOOP ``` *说明:`GetSelectedRow()`的参数表示起始查找位置,返回0表示无更多选中行。该方法直接读取数据窗口的选择状态,无需额外设置[^1]。* ### 方法二:通过自定义标志字段(需预先配置) 如果数据窗口已按引用[1]添加了flag字段: ```powerbuilder // 遍历所有行检查标志位 long ll_total_rows = dw_1.RowCount() FOR ll_row = 1 TO ll_total_rows IF dw_1.Object.flag[ll_row] = 1 THEN // 该行被选中 MessageBox("选中行", "行号:" + String(ll_row)) END IF NEXT ``` *说明:此方法需要预先在数据窗口SQL中添加标志字段,并在Clicked事件中维护flag值[^1]。* ### 最佳实践建议 1. **单选场景**推荐使用`GetRow()`获取当前行: ```powerbuilder long ll_current_row = dw_1.GetRow() ``` 2. **多选场景**应结合`SelectRow()`与`GetSelectedRow()`配合使用 3. 需要高亮显示时,可参考引用[2]的`RowFocusChanged`事件处理方式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值