Добавление значения в список, хранящийся в сеансе, а затем использование в качестве источника данных для ретранслятора

У меня на странице два репитера. В первом ретрансляторе есть LinkButton с именем команды и аргументом команды. При нажатии кнопки ссылки значение аргумента команды должно быть сохранено в сеансе, содержащем список. Затем я использую значение Session List для привязки второго повторителя.

У меня две проблемы:

1) Я привязываю второй повторитель к событию OnInit. Обработчик событий, который выполняется, когда LinkButton в первом репитере выполняется ПОСЛЕ события инициализации - поэтому, когда происходит привязка данных, новое значение еще не было добавлено в сеанс. Я не могу привязать данные позже события инициализации, потому что элементы управления во втором ретрансляторе необходимо поддерживать с помощью viewstate (или другого).

2) Во втором репитере есть два выпадающих списка. Оба связаны с данными в событии привязки данных репитеров. При изменении первого DDL мне нужно отфильтровать значения во втором DDL. Но этого просто не происходит.

Для наглядности примера я вырезал код из своего приложения и создал очень простую страницу aspx - весь код приведен ниже. Спасибо Бобби, который уже помог с этим.

Очень надеюсь, что кто-нибудь может помочь, так как я в тупике!

Разметка:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Repeater-Viewstate.aspx.cs" Inherits="test_Repeater_Viewstate" ViewStateMode="Enabled" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <h1>Repeater Test</h1>
        <h2>Repeater 1</h2>
        <asp:Repeater runat="server" Visible="true" ID="rptListItems">
            <ItemTemplate>
                Image ID: <asp:Literal ID="ImageID" runat="server" />&nbsp;&nbsp;
                <asp:LinkButton runat="server" CommandName="SelectImage" Text="Add to list" ID="AddToListCommand" />
                <hr />
            </ItemTemplate>
        </asp:Repeater>
        <h2>Repeater 2</h2>
        <asp:Repeater runat="server" Visible="true" ID="rptSelectedItems" ViewStateMode="Enabled">
            <ItemTemplate>
                The value of the item you selected is: <asp:TextBox runat="server" ID="ImageIDInput"/>
                <asp:DropDownList runat="server" ID="OptionsInput" AppendDataBoundItems="true" AutoPostBack="true" >
                    <asp:ListItem Text="Please choose..." Value="0" />
                </asp:DropDownList>
                <asp:DropDownList runat="server" ID="AttributesInput" runat="server" AppendDataBoundItems="true">
                    <asp:ListItem Text="Please choose..." Value="0" />
                </asp:DropDownList>
                <hr style="clear: both;" />
            </ItemTemplate>
        </asp:Repeater>
        <asp:Button runat="server" Text="Postback" />
    </div>
    </form>
</body>
</html>

Код позади:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class test_Repeater_Viewstate : System.Web.UI.Page
{

    //DUMMY Data for 1st Repeater
    public class MyRepeaterDataSource {

        public int ID { get; set; }
        public string Title { get; set; }

    }

    private List<MyRepeaterDataSource> _items;
    public List<MyRepeaterDataSource> Items {
        get {
            if (_items == null)
                _items = new List<MyRepeaterDataSource>();
            return _items;
        }
        set {
            _items = value;
        }
    }

    //END dummy data

    //DUMMY data for 1st dropdownlist in second repeater
    public class FirstDDLClass {

        public int ID { get; set; }
        public string Title { get; set; }

    }

    private List<FirstDDLClass> _firstDDLItems;
    public List<FirstDDLClass> FirstDDLItems {
        get {
            if (_firstDDLItems == null)
                _firstDDLItems = new List<FirstDDLClass>();
            return _firstDDLItems;
        }
        set {
            _firstDDLItems = value;
        }
    }

    //DUMMY data for 2nd dropdownlist in second repeater
    public class SecondDDLClass {

        public int ID { get; set; }
        public int ForeignKey { get; set; }
        public string Title { get; set; }
    }

    private List<SecondDDLClass> _secondDDLItems;
    public List<SecondDDLClass> SecondDDLItems {
        get {
            if (_secondDDLItems == null)
                _secondDDLItems = new List<SecondDDLClass>();
            return _secondDDLItems;
        }
        set {
            _secondDDLItems = value;
        }
    }

    public List<string> SelectedItems {
        get {
            if (Session["SelectedItems"] == null)
                Session["SelectedItems"] = new List<string>();
            return (List<string>)(Session["SelectedItems"]);
        }
        set {
            Session["SelectedItems"] = value;
        }
    }


    protected override void OnInit(EventArgs e) {


        //register events
        this.rptListItems.ItemDataBound += new RepeaterItemEventHandler(rptListItems_ItemDataBound);
        this.rptListItems.ItemCommand += new RepeaterCommandEventHandler(rptListItems_ItemCommand);
        this.rptSelectedItems.ItemDataBound += new RepeaterItemEventHandler(rptSelectedItems_ItemDataBound);

        //create a dummy list to populate first repeater
        MyRepeaterDataSource dataSource1 = new MyRepeaterDataSource();
        dataSource1.ID = 1;
        dataSource1.Title = "Item 1";
        Items.Add(dataSource1);

        MyRepeaterDataSource dataSource2 = new MyRepeaterDataSource();
        dataSource2.ID = 2;
        dataSource2.Title = "Item 2";
        Items.Add(dataSource2);

        MyRepeaterDataSource dataSource3 = new MyRepeaterDataSource();
        dataSource3.ID = 3;
        dataSource3.Title = "Item 3";
        Items.Add(dataSource3);

        MyRepeaterDataSource dataSource4 = new MyRepeaterDataSource();
        dataSource4.ID = 4;
        dataSource4.Title = "Item 4";
        Items.Add(dataSource4);

        //create a dummy list to populate the first dropdownlist in the second repeater
        FirstDDLClass class1 = new FirstDDLClass();
        class1.ID = 1;
        class1.Title = "Option 1";
        FirstDDLItems.Add(class1);

        FirstDDLClass class2 = new FirstDDLClass();
        class2.ID = 2;
        class2.Title = "Option 2";
        FirstDDLItems.Add(class2);

        //create a dummy list to populate the second dropdownlist in the second repeater
        SecondDDLClass class3 = new SecondDDLClass();
        class3.ID = 1;
        class3.ForeignKey = 1;
        class3.Title = "Attribute 1";
        SecondDDLItems.Add(class3);

        SecondDDLClass class4 = new SecondDDLClass();
        class4.ID = 1;
        class4.ForeignKey = 1;
        class4.Title = "Attribute 2";
        SecondDDLItems.Add(class4);

        SecondDDLClass class5 = new SecondDDLClass();
        class5.ID = 1;
        class5.ForeignKey = 2;
        class5.Title = "Attribute 3";
        SecondDDLItems.Add(class5);


        if (!this.Page.IsPostBack) {

            //bind 1st repeater
            this.rptListItems.DataSource = Items;
            this.rptListItems.DataBind();

        }

        //bind second repeater
        this.rptSelectedItems.DataSource = SelectedItems;
        this.rptSelectedItems.DataBind();


        base.OnInit(e);
    }

    protected void Page_Load(object sender, EventArgs e)
    {



    }

    void rptListItems_ItemDataBound(object sender, RepeaterItemEventArgs e) {

        Literal imageIDLiteral = e.Item.FindControl("ImageID") as Literal;
        if (imageIDLiteral is Literal) {

            imageIDLiteral.Text = DataBinder.Eval(e.Item.DataItem, "ID").ToString();

        }

        LinkButton linkButton = e.Item.FindControl("AddToListCommand") as LinkButton;
        if (linkButton is LinkButton) {

            linkButton.CommandArgument = DataBinder.Eval(e.Item.DataItem, "ID").ToString();

        }

    }


    void rptListItems_ItemCommand(object source, RepeaterCommandEventArgs e) {

        switch (e.CommandName) {

            case "SelectImage":

                this.SelectedItems.Add(e.CommandArgument.ToString());

                break;

        }

    }

    void rptSelectedItems_ItemDataBound(object sender, RepeaterItemEventArgs e) {

        switch (e.Item.ItemType) {

            case ListItemType.AlternatingItem:
            case ListItemType.Item:

                TextBox textBox = e.Item.FindControl("ImageIDInput") as TextBox;
                if (textBox is TextBox) {

                    textBox.Text = e.Item.DataItem.ToString();

                }

                DropDownList ddl1 = e.Item.FindControl("OptionsInput") as DropDownList;
                if (ddl1 is DropDownList) {

                    ddl1.DataValueField = "ID";
                    ddl1.DataTextField = "Title";
                    ddl1.DataSource = this.FirstDDLItems;
                    ddl1.DataBind();

                }

                DropDownList ddl2 = e.Item.FindControl("AttributesInput") as DropDownList;
                if (ddl2 is DropDownList) {

                    ddl2.DataValueField = "ID";
                    ddl2.DataTextField = "Title";
                    if (ddl1.SelectedIndex != 0) {
                        ddl2.DataSource = this.SecondDDLItems.Where(f => f.ForeignKey == Convert.ToInt32(ddl1.SelectedValue));
                        ddl2.DataBind();
                    }

                }




                break;

        }

    }

}

Заранее спасибо, ребята

Ал

9
задан higgsy 22 September 2011 в 17:53
поделиться