0

2 つのドロップダウン リストがあります。それらのいずれも互いに関係を持っていません。しかし、別のドロップダウン リストの選択した値に基づいて、1 つのドロップダウン リストをフィルター処理する必要があります。

コードでフィルタリングできます。デバッグすると、プロパティでフィルター処理された結果が表示されます。ただし、アプリを実行すると機能しません。これまでの私のコードは次のとおりです。

    private BindingList<Commodity> _AllocationCommodities;
    [Browsable(false)]
    public BindingList<Commodity> AllocationCommodities
    {
        get
        {
            if (_AllocationCommodities == null)
            {
                _AllocationCommodities = new BindingList<Commodity>();
                ChangeCommodities();
            }
            return _AllocationCommodities;
        }
    }
    private SourceEntity _SourceEntity;
    [ImmediatePostData]
    [Association("SourceEntity-LimitAllocations")]
    [RuleRequiredField("RuleRequiredField_LimitAllocation_SourceEntity", DefaultContexts.Save)]

    public SourceEntity SourceEntity
    {
        get
        {
            return _SourceEntity;
        }
        set
        {    

            //New Code
            if (SetPropertyValue<SourceEntity>("SourceEntity", value))
            {
                if (IsSaving || IsLoading) return;
                ChangeCommodities();
            }
        }
    }
    private Commodity _Commodity;// This is the drop down to be filtered
    [ImmediatePostData]
    [DataSourceProperty("AllocationCommodities")] //// This Attribute Should filter Commodities                 
    [RuleRequiredField("RuleRequiredField_LimitAllocation_Commodity", DefaultContexts.Save)]
    public Commodity Commodity
    {
        get
        {
            return _Commodity;
        }
        set
        {
            SetPropertyValue("Commodity", ref _Commodity, value);
            if (Commodity.Oid != Guid.Empty)
                AllocationVolumeUnits.Reload();
        }
    }
    private void ChangeCommodities()
    {
        if (!this.IsLoading && _SourceEntity != null)
        {
            _AllocationCommodities.RaiseListChangedEvents = false;
            _AllocationCommodities.Clear();
            OperandValue[] _params;
            System.Collections.Generic.List<CMSBOD.SourceCommodity> _sc = new System.Collections.Generic.List<SourceCommodity>();

            BindingList<Commodity> _Commodities = new BindingList<Commodity>();

            foreach (SourceCommodityEntity _tempSCE in _SourceEntity.SourceCommodityEntities)
            {
                if (_tempSCE.SourceCommodity != null)
                    _sc.Add(_tempSCE.SourceCommodity);
            }
            foreach (SourceCommodity _tempSC in _sc)
            {
                if (_tempSC.Commodity != null && !_Commodities.Contains<Commodity>(_tempSC.Commodity) && _tempSC.Commodity.IsActive)
                    _Commodities.Add(_tempSC.Commodity);
            }
            _AllocationCommodities.RaiseListChangedEvents = true;
            _AllocationCommodities = _Commodities;///This is where I can see the filtered list when debugging.


        }
    }
4

1 に答える 1

1

このシナリオでは、DataSourceProperty の代わりに DataSourceCriteria が役立ちます。

Commodity を SourceCommodityEntity に関連付けるコレクション プロパティがあると仮定すると、次の基準を使用できます。

[DataSourceCriteria("IsActive And SourceCommodities[SourceCommodityEntities[SourceEntity = '@SourceEntity'] ]")]]

1x1 アソシエーションとして設計されている場合でも、アソシエーションがフィルタリングの目的で役立つことがわかります。

于 2014-12-13T15:55:32.323 に答える