【PB】如何捕捉DropDownDW列的上下键事件

本文详细阐述了DDDW操作的触发方式及事件ID列表,包括如何通过pbm_command事件进行事件判断与处理,以及自动选择DDDW的具体实现。
DDDW 事件概述
  1、所有对DDDW的操作都通过触发pbm_command事件完成
  1)、在PB的用户事件中,大多数事件对应的Windows 事件都有两个参数:lparam 和 wparam,而在PB中,pbm_command没有参数,但可以通过message对象的两个属性取得Windows事件对应的Event ID,这两个属性就是: LongParm 和 WordParm。
  LongParm 包含DDDW的Handle,用intLow()可取得其Handle
  WordParm 包含对DDDW的操作,用intHigh()可取得其Event ID
  2)、在PB中,pbm_command带3个参数,其中hwndchild(long)与notificationcode(unsignedinteger)即DDDW的Handle和Event ID。

  2、DDDW 的Event ID 列表:
EventEvent ID备注
Clicked1281 
RowFocusChanged2048 
RightMouseButtonDown2314 
Left Button Up2313 
Retreive End769 
MouseMove2311 
RowFocusChanged2048至于问题中的上下滚动,倘为键盘,将导致行焦点改变(此外,还导致一个ID=2049的事件)
PageUp/PageDown2339鼠标点击滚动条上下按钮

  3、根据上述列表,就可以在 pbm_command 事件中判断对DDDW做了何种操作:
  DataWindowChild ldwc_Child
  GetChild( "Column", ldwc_Child )
  IF IntLow( Message.Longparm ) = Handle( ldwc_Child ) THEN 
    CHOOSE CASE IntHigh( Message.Wordparm )
       CASE 2048 // RowFocusChanged on DDDW
       CASE 1281 // Clicked
       CASE 2314 // Right Mouse Button Clicked
       CASE 2311 // MouseMove
    END CHOOSE
  END IF

  PB可以直接使用其参数hwndchild、notificationcode代替其中的intLow(Message.LongParm)和intHigh(Message.WordParm)。
  一个简单例子 -- 自动选择DDDW 
  DataWindowChild ldwc_Child
  String ls_Pointer
  Long ll_Row, ll_Lparam, ll_Lparam
  ll_Lparam = Message.LongParm
  ll_Lparam = Message.WordParm
  GetChild( "status", ldwc_Child ) // Replace the column name "status" as you needed
  IF IntLow( ll_Lparam) = Handle( ldwc_Child ) THEN
   CHOOSE CASE IntHigh( ll_Lparam ) 
       CASE 2311 // MouseMove
         // Get the object at pointer and parse out the Row #
         ls_Pointer = ldwc_Child.GetObjectAtPointer()
         ll_Row=Long( Mid( ls_Pointer, Pos( ls_Pointer, "~t" ) + 1 ))
         // If the Row is different then highlight it
         IF ldwc_Child.GetRow() <> ll_Row AND ll_Row > 0 THEN
          ldwc_Child.ScrollToRow( ll_Row )
         END IF
   END CHOOSE
  END IF

<think>好的,我现在需要帮助用户解决PowerBuilder中DropDownDW控件无法自动查询的问题。首先,我得回顾一下用户之前的提问和相关回答,确保解决方案的一致性和连贯性。用户之前提到子数据窗口不查询的问题,现在的问题是关于DropDownDW控件无法自动查询,这可能有一些共同的原因,比如数据对象绑定或事务对象设置,但DropDownDW作为下拉数据窗口控件,可能还有特定的配置需要注意。 首先,我应该考虑DropDownDW控件的基本工作原理。DropDownDW通常用于显示下拉表,其数据来自另一个数据窗口对象。如果自动查询失效,可能原因包括数据源未正确设置、事务对象未分配、检索参数缺失或事件被拦截等。 接下来,我需要参考用户提供的引用[1],其中提到DataWindow是核心对象,用于数据操作,涉及数据源绑定、显示样式设置和脚本控制。这可能意味着在DropDownDW中需要正确设置数据源和数据窗口对象,同时确保事务对象正确传递。 用户之前的问题中提到的子数据窗口解决方案包括检查DataObject属性、事务对象分配、检索参数、事件拦截等。这些同样适用于DropDownDW,但需要针对其特定的使用场景进行调整。例如,DropDownDW可能在父窗口的ItemChanged事件中触发检索,或者需要动态设置数据对象。 可能的解决步骤: 1. **数据对象绑定**:确认DropDownDW的DataObject属性是否正确设置,是否在代码中动态分配时出现错误。 2. **事务对象分配**:确保父窗口和DropDownDW使用同一个事务对象,显式调用SetTransObject。 3. **自动检索配置**:检查DropDownDW的AutoRetrieve属性是否启用,或者在父窗口检索时手动触发子控件的检索。 4. **参数传递**:如果DropDownDW依赖父数据窗口的某个值作为参数,需在检索时传递该参数,可能通过ItemChanged事件触发。 5. **事件处理**:检查是否有事件(如RetrieveStart)返回了1,导致检索被中止。 6. **数据窗口更新属性**:确认子数据窗口的更新属性是否正确,确保表名和名无误。 7. **调试方法**:建议用户使用Describe或调试输出查看SQL语句,确认是否正确生成。 此外,还需要考虑用户可能的误操作,例如未在父窗口的检索后触发子控件的检索,或者在设计时未正确设置DropDownDW的属性。例如,DropDownDW可能需要设置AutoRetrieve为True,或者在父数据窗口检索后手动调用Retrieve()。 需要验证这些可能性,并逐一排查。例如,如果事务对象未正确分配,即使DataObject正确,数据也无法检索。同样,如果参数未传递,DropDownDW可能无法获取必要的数据。此外,某些事件如ItemChanged可能需要编写代码来触发检索。 最后,应该总结常见原因和解决方案,帮助用户系统地检查问题,并提供示例代码,方便用户参考实现。同时,生成相关问题,帮助用户进一步理解相关知识点,如调试方法、参数传递优化等。</think>针对PowerBuilder中DropDown DataWindow(下拉数据窗口)控件无法自动查询的问题,以下是常见原因及系统性解决方案: --- ### 一、基础配置检查 1. **数据对象绑定错误** - **现象**:下拉表无数据显示或显示空白 - **解决**:验证`dddw_控件的DataObject`属性是否指向正确的子数据窗口对象 ```powerscript // 在父窗口的Open事件或控件构造函数中设置 dddw_1.Object.DataWindow.Child.Type = "DataWindow" dddw_1.Object.DataWindow.Child.DataObject = "d_dropdown_list" // 子数据窗口对象名称 ``` 2. **事务对象未分配** - **现象**:下拉数据窗口无法连接数据库 - **解决**:显式为子数据窗口分配事务对象 ```powerscript // 父窗口检索前需传递事务对象 dddw_1.SetTransObject(SQLCA) // 必须与父窗口一致[^1] ``` --- ### 二、自动检索机制失效 3. **AutoRetrieve属性未启用** - **现象**:下拉数据窗口需手动触发检索 - **解决**:启用属性或通过代码强制检索 ```powerscript // 方法1:属性设置 dddw_1.AutoRetrieve = True // 设计时在属性面板勾选 // 方法2:父窗口检索时联动 dw_parent.Retrieve() dddw_1.Retrieve() // 显式调用检索 ``` 4. **参数依赖未处理** - **现象**:下拉内容需依赖父数据窗口字段值 - **解决**:在父窗口`ItemChanged`事件中动态传递参数 ```powerscript // 示例:根据父窗口的dept_id动态过滤下拉表 IF dwo.Name = "dept_id" THEN dddw_1.Retrieve(dw_parent.GetItemString(row, "dept_id")) END IF ``` --- ### 三、事件拦截与数据约束 5. **RetrieveStart事件拦截** - **现象**:检索过程被意外终止 - **解决**:检查子数据窗口事件返回值 ```powerscript // 子数据窗口的RetrieveStart事件 RETURN 0 // 返回0允许检索,返回1则取消[^1] ``` 6. **数据窗口过滤条件冲突** - **现象**:检索结果不符合预期 - **解决**:清除无效过滤条件 ```powerscript dddw_1.SetFilter("") // 清空过滤器 dddw_1.Filter() ``` --- ### 四、高级调试技巧 7. **SQL跟踪验证** - 使用`Describe`函数输出实际执行的SQL: ```powerscript string ls_sql ls_sql = dddw_1.Describe("DataWindow.Table.Select") MessageBox("当前SQL", ls_sql) ``` 8. **数据窗口更新属性验证** - 检查子数据窗口的更新权限配置: ```powerscript // 确保Table.Updateable属性为"Yes" dddw_1.Modify("DataWindow.Table.Updateable='Yes'") ``` --- ### 五、代码示例(完整流程) ```powerscript // 父窗口Open事件 SQLCA.AutoCommit = False dw_parent.SetTransObject(SQLCA) dw_parent.Retrieve() // 初始化下拉控件 dddw_1.SetTransObject(SQLCA) dddw_1.Object.DataWindow.Child.DataObject = "d_dropdown_list" dddw_1.Retrieve() // 若无需参数则直接检索 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值