2010-03-16 4 views
2

J'ai un ASP:Repeater Ce que je voudrais afficher une liste de cases à cocher. Ces cases à cocher sont liés à une liste de préférences de l'utilisateur et la réponse des utilisateurs résultant. Voir le code ci-dessous.asp: événements de répétition - comment postback

Je voudrais ajouter faire une des opérations suivantes si possible

Option 1: Ce serait génial si je pouvais utiliser l'événement dans le Repeater:OnItemCommand(...) au feu si l'un des éléments changent. Il me semble que cet événement ne se déclenchera que s'il y a un bouton | LinkButton | ImageButton dans la liste. IE, il ne se déclenche pas si je mets dans une case à cocher avec autopostback = « true »

Option 2: Est-il possible que je pourrais joindre une méthode pour un événement de CheckBox: CheckChanged je aurais besoin de passer cette méthode un paramètre indiquant quelle combinaison de questions/réponses changer.

Option 3: C'est votre réponse si vous connaissez un moyen plus simple qui serait génial.

Le Code:

<asp:Repeater ID="RPTprefs" runat="server" DataSourceID="getAnswers" OnItemCommand="RPTprefs_ItemCommand"> 
     <ItemTemplate> 
     <li><asp:CheckBox ID='questionID' runat="server" 
     Checked='<%# Eval("pr.up_is_selected") %>' 
     Text='<%# Eval("prp.prefs_question") %>' 
     AutoPostBack="true" 
     OnCheckedChanged="CheckChanged" /></li> 
       </ItemTemplate> 
       </asp:Repeater> 

Merci à l'avance

Répondre

4

Voici ce que je suis venu avec, ce qui est fondamentalement option # 2. Dans le ItemTemplate du répéteur, j'utilise un contrôle littéral (Visible défini sur false) qui a l'argument que vous souhaitez transmettre à la fonction CheckedChanged. La raison de l'utilisation d'un contrôle est que le contrôle conservera sa valeur dans ViewState après une publication, alors que la source de données d'origine pour le répéteur sera perdue.

Dans la fonction OnItemCreated, je lie la fonction CheckChanged pour que toutes les cases à cocher passent dans le bon argument. Voici mon exemple complet. Dans ce cas, je souhaite transmettre la propriété Id de mes données à la fonction CheckChanged.

Markup:

<asp:Repeater ID="Repeater1" runat="server" OnItemCreated="ItemCreated"> 
     <ItemTemplate> 
      <asp:Literal ID="litArg" runat="server" Visible="false" Text='<%# Eval("Id") %>'> 
      </asp:Literal><%# Eval("Name") %> 
      <asp:CheckBox ID="chkCool" runat="server" AutoPostBack="true" Checked='<%# Eval("IsCool") %>' /><br /> 
     </ItemTemplate> 
</asp:Repeater> 

code derrière:

public class SomeClass 
{ 
    public SomeClass(bool c, string n, int id) 
    { 
     IsCool = c; 
     Name = n; 
     Id = id; 
    } 
    public bool IsCool { get; set; } 
    public string Name { get; set; } 
    public int Id { get; set; } 
} 
. 
. 
. 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     List<SomeClass> people = new List<SomeClass>(); 

     people.Add(new SomeClass(true, "Will", 666)); 
     people.Add(new SomeClass(true, "Dan", 2)); 
     people.Add(new SomeClass(true, "Lea", 4)); 
     people.Add(new SomeClass(false, "Someone", 123)); 

     Repeater1.DataSource = people; 
     Repeater1.DataBind(); 
    } 
} 

private void CheckChanged(int id) 
{ 
    Response.Write("CheckChanged called for item #" + id.ToString()); 
} 

protected void ItemCreated(object sender, RepeaterItemEventArgs e) 
{ 
    //this needs to be set again on post back 
    CheckBox chk = (CheckBox)e.Item.FindControl("chkCool"); 
    Literal arg = (Literal)e.Item.FindControl("litArg"); 

    Action<object, EventArgs> handler = (s, args) => CheckChanged(Convert.ToInt32(arg.Text)); 
    chk.CheckedChanged += new EventHandler(handler); 
} 

espoir qui aide.

+1

Merci, merci. Mille fois merci. J'ai essayé de résoudre cela pendant 2 jours. Vous avez vraiment mis un peu d'effort pour cette réponse, je voudrais pouvoir voter plus d'une fois. ;) – Kieran

+2

Pas de problème :). Je dois dire, parfois les contrôles asp.net ne sont pas faciles à utiliser. – wsanville

Questions connexes