现在有个需求是:下拉框里面的数据是可以停用的,停用之后用户是不能再选择已经停用的数据,但是要之前已经选择了停用数据的没影响。
我的解决思路为:在下拉框的展开事件中,将Enabled=false的过滤掉,保留启用的和没有Enabled字段的数据。这样如果用户没有去点击停用数据的combobox数据是不会丢掉,而且验证也能通过
在EXT.JS下的具体实现为下面的代码(删除了一些与本实现无关的代码),expand方法为查询的时候调用的(查询方法去掉了),监听change事件,目的在于选择完之后将过滤掉的数据加回来
要注意的是
1:Ext的filterBy事件会触发change事件,所以需要在filterBy时将change事件挂起
2:filterDisabled属性为mvc后台下发的,作用在于只有在需要的时候才启用过滤掉禁用的数据
Ext.form.field.ComboBox.override({
useHiddenField: false,
forceSelection: true,
queryParam: "filter",
clearIcon: true,
filterDisabled: false, //是否启用过滤停用数据
//matchFieldWidth:false,
initComponent: function () {
var me = this;
me.callParent(arguments);
me.on("change", me.change, me);
},
expand: function () {
var me = this;
if (me.filterDisabled) {
//移除Enabled==false的数据
me.suspendEvent(‘change‘);//挂起change事件
me.getStore().filterBy(function (item) {
return item.get("Enabled") !== false && item.get("field3") !== "False";//field3是grid中下拉框的启用字段
}
);
me.resumeEvent(‘change‘);//取消挂起change事件
}
me.callParent(arguments);
},
change: function (obj,isDirty,e) {
var me = this;
if (me.filterDisabled) {
me.getStore().clearFilter();
}
},
onDestroy: function () {
Ext.destroy(this.clearIconEl);
this.callParent(arguments);
}
});
后台下发filterDisabled属性
/// <summary> /// 启用下拉框过滤禁用/停用的数据(form中使用) /// </summary> /// <param name="builder"></param> public static void EnableFilterDisabled(this ComboBox.Builder builder) { builder.Config("filterDisabled", true); }
在grid中的下发为

效果如下

可以看到退货原因列中被停用了的数据“买错了”已经被过滤掉了。
要注意的是grid中下发的属性是在列中的,还需要自行处理下
原文:https://www.cnblogs.com/Cyril-hcj/p/11718668.html