2011-09-22 3 views
9

Ho due ripetitori sulla mia pagina. Il primo ripetitore ha un LinkButton, con un comando e un comando. Quando si fa clic sul pulsante link, il valore di commandarguement deve essere memorizzato in una Session contenente List. Quindi uso il valore di Session List per collegare il secondo ripetitore.Aggiunta di valore alla lista memorizzata nella sessione e quindi usando come origine dati per il ripetitore

Sto avendo due problemi:

1) Sono legare il secondo ripetitore in caso OnInit. Il gestore di eventi che viene eseguito quando viene eseguito il LinkButton nel primo ripetitore DOPO l'evento init, pertanto, quando si verifica l'associazione dei dati, il nuovo valore non è stato ancora aggiunto alla sessione. Non riesco a legare i dati più tardi rispetto all'evento init perché i controlli all'interno del secondo ripetitore devono essere gestiti utilizzando viewstate (o altro).

2) Nel secondo ripetitore ci sono due elenchi a discesa. Entrambi sono databound nell'evento itemdatabound dei ripetitori. Quando viene modificato il primo DDL, devo filtrare i valori nel secondo DDL. Ma questo non sta succedendo.

Per gli scopi di un esempio più chiaro, ho rimosso il codice dalla mia applicazione e creato una pagina di aspx molto semplice - tutto il codice è sotto. Grazie a Bobby che ha già aiutato con questo.

Spero davvero che qualcuno possa aiutare mentre sono perplesso!

Markup:

<%@ 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> 

codice dietro:

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; 

     } 

    } 

} 

Grazie in anticipo ragazzi

Al

risposta

1

Se si aggiunge il seguente codice:

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

     } 
    } 

E il seguente markup:

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

(Nello specifico, aggiungendo l'OnSelectedIndexChanged = "OptionsInput_SelectedIndexChanged")

Ha funzionato per me.

Problemi correlati