资源说明:在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,使得用户在选择性别等选项时看到的是易于理解的文本描述,而不是后台的标识数据。这提高了用户体验,同时也保证了数据的一致性和准确性。
本源码包内暂不包含可直接显示的源代码文件,请下载源码包。