ExtJS PropertyGrid中使用Combobox选择值问题
文件大小: 28k
源码售价: 10 个金币 积分规则     积分充值
资源说明:在ExtJS中,PropertyGrid是一种用于展示对象属性的控件,它可以方便地编辑和查看对象的各个属性。在PropertyGrid中遇到的一个常见问题是当使用Combobox(下拉列表框)作为编辑器时,用户选择的值(displayField)与实际保存的值(valueField)不一致。通常,displayField用于显示用户友好的文本,而valueField则是存储在后台的数据,可能是数字或其他标识符。在本问题中,用户期望看到的是displayField(如'男'或'女')的值,但实际保存并显示的是valueField(如'0'或'1')。 为了解决这个问题,我们需要确保在用户选择 Combobox 项后,PropertyGrid 显示和保存的是 displayField 的值,而不是 valueField。一种解决方法是通过监听PropertyGrid的`beforepropertychange`事件,在这个事件中进行处理。 `beforepropertychange`事件在用户尝试修改属性值之前触发,我们可以在这个时机拦截该事件,将 Combobox 选择的 displayField 值设置到对应的记录中,然后返回 `false` 来阻止默认的修改行为,防止 valueField 的值被保存。 以下是一个示例代码片段,展示了如何实现这一操作: ```javascript // 假设 cmbBrandEdit 是 Combobox 组件实例,BRAND_NAME 是 PropertyGrid 中的属性名 var cmbBrandEdit = ...; // 在PropertyGrid配置中添加事件监听 listeners: { beforepropertychange: function(source, recordId, value, oldValue) { // 检查是否是修改 BRAND_NAME 属性 if (recordId === 'BRAND_NAME') { // 获取当前选中的记录 var record = this.getStore().getById(recordId); // 暂停事件处理,避免在设置值时触发其他事件 this.suspendEvents(); // 查找与 valueField 值匹配的 Combobox 记录 var selectedRecord = cmbBrandEdit.store.getAt(cmbBrandEdit.store.find('BRAND_ID', value)); // 设置 displayField 的值到 record record.set("value", selectedRecord.get('BRAND_NAME')); // 提交更改 record.commit(); // 恢复事件处理 this.resumeEvents(); // 阻止默认的修改事件,确保我们设置的值被保存 return false; } } } ``` 这段代码首先检查即将修改的属性是否是`BRAND_NAME`,如果是,就获取Combobox对应的store中的记录,并找到与当前valueField值对应的displayField值。然后,它会暂停PropertyGrid的事件处理,防止在设置新值时触发其他不必要的行为。接着,将找到的displayField值设置到PropertyGrid的记录中,并提交更改。恢复事件处理并返回`false`,阻止PropertyGrid的默认修改过程,从而确保显示和保存的是displayField的值。 通过这种方式,我们可以在PropertyGrid中正确地使用Combobox,使得用户在选择性别等选项时看到的是易于理解的文本描述,而不是后台的标识数据。这提高了用户体验,同时也保证了数据的一致性和准确性。
本源码包内暂不包含可直接显示的源代码文件,请下载源码包。