现在有个需求是:下拉框里面的数据是可以停用的,停用之后用户是不能再选择已经停用的数据,但是要之前已经选择了停用数据的没影响。

我的解决思路为:在下拉框的展开事件中,将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中下发的属性是在列中的,还需要自行处理下

版权声明:本文为Cyril-hcj原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/Cyril-hcj/p/11718668.html