下拉框停用数据的处理
现在有个需求是:下拉框里面的数据是可以停用的,停用之后用户是不能再选择已经停用的数据,但是要之前已经选择了停用数据的没影响。
我的解决思路为:在下拉框的展开事件中,将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中下发的属性是在列中的,还需要自行处理下