0

RadListBox で選択した値に基づいて ObjectDataSource をフィルタリングした後、DropDownList に宣言的にバインドしようとしています。さらに悪いことに、コントロール間のバインディングを宣言的に行う必要があります。

SelectParameters を ListBox.SelectedItems プロパティにバインドできなかったため、RadListBox から継承し、プロパティを提供して IList をオブジェクトにキャストしようとしました。次に、私のサービスでは、オブジェクトをパラメーターとして受け入れます。しかし、何らかの理由で、そのプロパティは無限に呼び出されます。

マークアップ:

<cust:CustomListBox ID="listTypes" 
                    AutoPostBack="true"
                    EnableLoadOnDemand="true"
                    DataTextField="Text" 
                    DataValueField="Value" 
                    DataSourceID="listTypesDataSource"
                    EnableEmbeddedSkins="false"
                    SelectionMode="Multiple"
                    runat="server" />

<cust:RadComboBox ID="aggregatedCompetitors1" 
                    AutoPostBack="true" 
                    DataSourceID="aggregatedCompetitors1DataSource" 
                    DataTextField="Text" 
                    DataValueField="Value" 
                    runat="server" />

<cust:ObjectDataSource ID="listTypesDataSource"
                      TypeName="TestServices.TestService"
                      SelectMethod="GetProductTypes"
                      runat="server" />

<cust:ObjectDataSource ID="aggregatedCompetitors1DataSource"
                      TypeName="TestServices.TestService"
                      SelectMethod="GetCompetitors1"
                      runat="server">
    <SelectParameters>
        <asp:ControlParameter Name="productTypes" 
                              ControlID="listTypes"
                              Type="Object"
                              PropertyName="SelectedValuesAsObject" />
    </SelectParameters>
</cust:ObjectDataSource>

コード:

public class CustomListBox : RadListBox
{
    public object SelectedValuesAsObject
    {
        get
        {
            return (object)this.SelectedItems;
        }
    }
}

私のテストサービスクラス。

public class TestService
{
    public List<ListItem> GetProductTypes()
    {
        return ProductTypes();
    }

    public List<ListItem> GetCompetitors1(object productTypes)
    {
        IList<RadListBoxItem> selectedItems = (IList<RadListBoxItem>)productTypes;
        List<ListItem> aggregatedValues = new List<ListItem>();

        foreach(var selectedValue in selectedItems)
        {
            aggregatedValues.AddRange(Compeitors().Where(c => c.CompType == selectedValue.Value)
                .Where(c => c.Brand.In("Ford", "HP")));
        }

        return aggregatedValues;
    }

    private List<ListItem> ProductTypes()
    {
        return new List<ListItem>()
        {
            new ListItem("computers", "Computers"),
            new ListItem("cars", "Cars")
        };
    }

    private List<ListItem> Compeitors()
    {
        return new List<ListItem>()
        {
            new ListItem("Ford Tauris", "cars", "Ford"),
            new ListItem("Ford Escort", "cars", "Ford"),
            new ListItem("Ford Ranger", "cars", "Ford"),
            new ListItem("HP 2000z Series", "computers", "HP"),
            new ListItem("HP Pavillion g6t", "computers", "HP"),
            new ListItem("HP Pavillion g6z", "computers", "HP"),
            new ListItem("Chevy Impala", "cars", "Chevy"),
            new ListItem("Chevy Malibu", "cars", "Chevy"),
            new ListItem("Chevy Silverado", "cars", "Chevy"),
            new ListItem("Dell Precision T3500", "computers", "Dell"),
            new ListItem("Dell Precision T2500", "computers", "Dell"),
            new ListItem("Dell Latitude 2120", "computers", "Dell")
        };
    }
}

スタックトレース: スタックトレース

4

0 に答える 0