将值添加到存储在会话中的列表,然后将其用作转发器的数据源

hig*_*gsy 9 c# asp.net repeater session-state

我的页面上有两个中继器.第一个转发器中有一个LinkBut​​ton,带有命令名和命令规范.单击linkbutton时,commandarguement的值应该存储在包含List的Session中.然后我使用Session List的值绑定第二个转发器.

我有两个问题:

1)我在OnInit事件中绑定了第二个转发器.在init事件之后执行第一个转发器中的LinkBut​​ton时执行的事件处理程序 - 因此,当数据绑定发生时,新值尚未添加到会话中.我不能在init事件之后绑定数据,因为第二个转发器中的控件需要使用viewstate(或其他)来维护.

2)在第二个中继器中有两个下拉列表.两者都是在转发器itemdatabound事件中的数据绑定.当第一个DDL更改时,我需要过滤第二个DDL中的值.但这并没有发生.

为了更清楚的例子,我已经从我的应用程序中删除了代码并创建了一个非常简单的aspx页面 - 所有代码都在下面.感谢已经帮助过这个的Bobby.

真的希望有人可以帮忙,因为我难倒!

标记:

<%@ 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>
Run Code Online (Sandbox Code Playgroud)

代码背后:

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;

        }

    }

}
Run Code Online (Sandbox Code Playgroud)

先谢谢你们

Mar*_*ell 1

如果添加以下代码:

    protected void OptionsInput_SelectedIndexChanged(object sender, EventArgs e)
    {
        DropDownList optionsInput = sender as DropDownList;
        DropDownList ddl2 = optionsInput.Parent.FindControl("AttributesInput") as DropDownList;
        if (ddl2 is DropDownList)
        {

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

        }
    }
Run Code Online (Sandbox Code Playgroud)

以及以下标记:

<asp:DropDownList runat="server" ID="OptionsInput" AppendDataBoundItems="true" AutoPostBack="true" OnSelectedIndexChanged="OptionsInput_SelectedIndexChanged" >
Run Code Online (Sandbox Code Playgroud)

(具体来说,添加 OnSelectedIndexChanged="OptionsInput_SelectedIndexChanged")

这对我有用。