我的页面上有两个中继器。第一个转发器中有一个LinkBut​​ton,其中包含命令名和命令参数。单击链接按钮时,应该将命令参数的值存储在包含列表的 session 中。然后,我使用“ session 列表”的值来绑定(bind)第二个转发器。

我有两个问题:

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

2)在第二个转发器中,有两个下拉列表。两者在转发器itemdatabound事件中都是数据绑定(bind)的。当第一个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>

后面的代码:
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;

        }

    }

}

在此先感谢大家

最佳答案

如果添加以下代码:

    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();
            }

        }
    }

以及以下标记:
<asp:DropDownList runat="server" ID="OptionsInput" AppendDataBoundItems="true" AutoPostBack="true" OnSelectedIndexChanged="OptionsInput_SelectedIndexChanged" >

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

它为我工作。

关于c# - 将值添加到 session 中存储的列表中,然后用作转发器的数据源,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7515371/

10-12 19:46