2012-04-12 6 views
1

Also habe ich die Datensouce entfernt und habe nur DataBind() dann meine Seite ist immer noch bläst und die Seite aktualisieren und nicht in einem Bearbeitungsmodus.Reagieren auf Button Events in Repeater ItemTemplate

was ich versuche zu tun ist, wenn der Benutzer auf Bearbeiten klicken, dann machen es Inline-Bearbeitung der Repeater-Zeile.

END UPDATE

OnItemCommand ich habe DataBind() hinzugefügt

rpt.DataSource = mydatasource; 
rpt.DataBind(); 

, nachdem ich tun, dass meine Seite nicht im Bearbeitungsmodus befindet und es wegblasen und every wird aktualisiert i auf page_load haben

if (!IsPostBack) 
{ 
    rpt.DataSource = mydatasource; 
    rpt.DataBind(); 

} 

Ende Update

Ich habe Repeater oft ohne Probleme verwendet, aber hier ist etwas los. Ich habe einen Repeater und ich bin zu dem Ereignis ItemDataBound abonnieren möchte, aber wenn ich auf die Schaltfläche klicken (das ist ein Linkbutton in meinem Repeater itemtemplate ist) es geht nicht an die ItemDataBound

<asp:Repeater ID="rpt" runat="server" OnItemCommand="rpt_OnItemCommand" OnItemDataBound="rpt_OnItemDataBound"> 
    <ItemTemplate> 
     <li> 
      <asp:Label ID="Label" runat="server" /> 
      <asp:LinkButton ID="LinkButton1" runat="server" CommandName="edit" CommandArgument='<%# Eval("MyID") %>' 
       Text='<%# Eval("Title") %>' /> 
     </li> 
    </ItemTemplate> 
</asp:Repeater> 


    protected void rpt_OnItemCommand(object source, RepeaterCommandEventArgs e) 
      { 
       if (e.CommandName == "delete") 
       { 
        //Data.Contacts.RemoveAt(e.Item.ItemIndex); 
       } 
       else if (e.CommandName == "edit") 
       { 
        EditIndex = e.Item.ItemIndex; 
       } 
       else if (e.CommandName == "save") 
       { 
        //   
       } 

      } 


protected void rpt_OnItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
     { 

     if (e.Item.ItemIndex == EditIndex) 
     { 
      // never come to this line.... after the user click on LinkButton 

     } 

     } 
} 

Antwort

0

Ich weiß nicht, ob das hilft, aber Sie müssen DataBind() aufrufen, damit das OnItemDataBound-Ereignis ausgelöst wird. Ich vermute auch, dass Sie versuchen, den EditIndex im OnItemCommand festzulegen und dann den Wert im OnDataBind-Ereignis zu verwenden. Die Ereignisse werden in der Reihenfolge OnItemDataBound und OnItemCommand ausgelöst, sodass der EditIndex in dieser Situation nicht korrekt ist.

Fügen Sie rpt.DataBind dem OnItemCommand hinzu. Dies funktioniert, wenn ich es aus Ihrem Code versuchte, beachten Sie, dass Sie zweimal binden werden, wenn Sie nicht! IsPostBack für die ursprüngliche Datenbindung verwenden.

rpt.DataSource = strings; 

    if (!IsPostBack) 
    { 
     rpt.DataBind(); 
    } 

protected void rpt_OnItemCommand(object source, RepeaterCommandEventArgs e) 
{ 
     if (e.CommandName == "delete") 
     { 
      //Data.Contacts.RemoveAt(e.Item.ItemIndex); 
     } 
     else if (e.CommandName == "edit") 
     { 
      EditIndex = e.Item.ItemIndex; 
     } 
     else if (e.CommandName == "save") 
     { 
      //   
     } 

    rpt.DataBind(); 

    } 
+0

ich denke, du bist richtig und aber wenn ich die datenbank() habe meine seite aktualisieren und ich bin aus dem bearbeitungsmodus eines repter .. keine idee? –

+0

Mehr zur Antwort hinzugefügt. – tclarkston

+0

Ich habe meine Frage aktualisiert –

0

Sie Ihre rpt_OnItemCommand Funktion ändern müssen .

protected void rpt_OnItemCommand(object source, RepeaterCommandEventArgs e) 
{ 
    if (e.CommandName == "delete") 
    { 
     //Data.Contacts.RemoveAt(e.Item.ItemIndex); 
    } 
    else if (e.CommandName == "edit") 
    { 
     EditIndex = e.Item.ItemIndex; 
    } 
    else if (e.CommandName == "save") 
    { 
     //   
    } 
    else if (e.CommandName == "Complete") 
    { 
     // your function goes here 
    } 
} 
+1

Wie behebt dies das Problem? Es sieht so aus, als hättest du gerade eine zusätzliche 'else if'-Bedingung hinzugefügt ... –

+0

Wenn Sie auf einen LinkButton innerhalb des Repeaters klicken, wird die Funktion rpt_OnItemCommand ausgelöst, nicht rpt_OnItemDataBound. Sie haben Ihren Code in die Funktion rpt_OnItemDataBound geschrieben, aber ich habe es in der Funktion rpt_OnItemCommand ausgeführt. – laltin

+0

Ich frage mich, warum Sie Ihren Code in OnItemDataBound-Funktion ausführen möchten. Ich denke, es wäre viel einfacher in OnItemCommand-Funktion. – laltin

0

Ich bin ein wenig verwirrt, aber aus dem obigen Beispiel sieht es aus, als ob Sie es rückwärts haben. Der Knopf klicken würde nie das Ereignis ItemDataBound feuern. Das Ereignis ItemDataBound wird nur aufgerufen, nachdem jedes Element an den Repeater gebunden wurde.

auf die Schaltfläche klicken sollte das ItemCommand Ereignis jedoch ausgelöst, und wenn das nicht geschieht, würde ich überprüfen, um sicherzustellen, dass Sie tatsächlich die ItemCommand Handler zugewiesen haben, und auch sicherstellen, dass der Befehlsname gültig ist.

Auf eine Randnotiz kann dieses Verhalten auch auftreten, wenn der Repeater bei jedem Postback gebunden ist. Stellen Sie sicher, dass Sie den Repeater binden, wenn !Page.IsPostBack.

0

Warum denken Sie, dass die ItemDataBound ausgelöst wird, wenn Sie auf Ihre LinkButton klicken? ItemDataBound wird nur ausgelöst, wenn Repeater.DataBind() aufgerufen wird. Tatsächlich wird stattdessen das Ereignis ItemCommand des Repeaters ausgelöst.

Verwandte Themen