2011-09-22 66 views
9

我的頁面上有兩個中繼器。第一個轉發器中有一個LinkBut​​ton,帶有一個命令名和commandarguement。當單擊linkbutton時,commandarguement的值應該存儲在包含List的Session中。然後我使用會話列表的值綁定第二個中繼器。將值添加到存儲在會話中的列表中,然後用作中繼器的數據源

我有兩個問題:

1)我綁定在OnInit事件的第二中繼器。第一個中繼器中的LinkBut​​ton在init事件後執行時執行的事件處理程序 - 因此,當數據綁定發生時,新值尚未添加到會話中。由於第二個中繼器中的控件需要使用viewstate(或其他)來維護,因此我無法在init事件之後綁定數據。

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> 

後面的代碼:

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; 

     } 

    } 

} 

在此先感謝球員

回答

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

     } 
    } 

而下面的標記:

<asp:DropDownList runat="server" ID="OptionsInput" AppendDataBoundItems="true" AutoPostBack="true" OnSelectedIndexChanged="OptionsInput_SelectedIndexChanged" > 

(具體地說,在添加了OnSelectedIndexChanged = 「OptionsInput_SelectedIndexChanged」)

它爲我工作。

相關問題