2009-10-07 5 views
0

Dans mon code, je crée les éléments de menu dynamique:C# asp.net pourquoi mon manuel __doPostBack ne s'exécute qu'une seule fois?

string listClientID = BulletedList1.ClientID.Replace('_', '$'); 
int counter = 0; 

foreach (DataRow dataRow in database.DataTable.Rows) 
{ 
    // Add Button 
    ListItem listItem = new ListItem(); 
    listItem.Value = "buttonItem" + Convert.ToString(dataRow["rank"]); 
    listItem.Text = " " + Convert.ToString(dataRow["title"]); 
    listItem.Attributes.Add("onclick", "__doPostBack('" + listClientID + "', '"+ counter.ToString() +"')"); 

    BulletedList1.Items.Add(listItem); 

    counter++; 

} 

Ce menu est à l'intérieur d'un panneau de mise à jour:

<div id="MenuItemBox"> 
    <asp:BulletedList 
     ID="BulletedList1" 
     runat="server" 
     OnClick="MenuItem_Click" 
     > 
    </asp:BulletedList> 
</div> 

Ce que je veux quand un listitem est cliqué, il exécute un postback. Mais quand je lance ceci, l'événement onclick n'est exécuté qu'une fois.

Par exemple. J'ai 4 listitems. Lorsque je clique sur le premier élément la première fois que l'événement onclick est exécuté. Maintenant, je clique sur le deuxième élément, l'événement onclick est également exécuté. Mais lorsque je clique à nouveau sur le premier élément, l'événement onclick n'est pas déclenché.

Lorsque je vérifie la console d'erreur dans FireFox ou Oprah, je n'obtiens aucune erreur. Donc, ma question est: comment puis-je résoudre ce problème et qu'est-ce que je fais de mal?

Répondre

1

Il semble que vous ayez besoin de le relier après la publication. Où ajoutez-vous des éléments au menu et vérifiez-vous la propriété IsPostBack? S'il vous plaît comparer html après le premier chargement et le paquet pour voir si _dopostback disparaît.

Ensuite, essayez de supprimer IsPostBack vérifier. Mon code fonctionne bien. Voilà.

public partial class _Default : System.Web.UI.Page { 
    protected void Page_Load (object sender, EventArgs e) { } 

    protected override void OnInit (EventArgs e) { 
     base.OnInit(e); 
     //if (!IsPostBack) { 
      string listClientID = BulletedList1.ClientID.Replace('_', '$'); 
      int counter = 0; 

      List<SomeClass> items = new List<SomeClass>(){ new SomeClass() { Rank = 1, Title = "2"}, 
      new SomeClass() {Rank = 2, Title = "Two"}}; 


      foreach (var item in items) { 
       // Add Button 
       ListItem listItem = new ListItem(); 
       listItem.Value = "buttonItem" + item.Rank; 
       listItem.Text = " " + item.Title; 
       listItem.Attributes.Add("onclick", "__doPostBack('" + listClientID + "', '" + counter.ToString() + "')"); 

       BulletedList1.Items.Add(listItem); 

       counter++; 

      } 
     //} 
    } 

    protected void MenuItem_Click (object sender, BulletedListEventArgs e) { 
     Response.Write(e.Index); 
    } 

    class SomeClass { 
     public int Rank; 
     public string Title; 
    } 
} 
+0

Dans mon page_load, j'ai un chèque pour isPostBack. Si vous avez quelque chose comme if (! IsPostBack) {build menu}. Le __doPostBack ne disparaît pas – Martijn

+0

Thnx pour la réponse, mais pourquoi utilisez-vous OnInit et pas Page_Load? – Martijn

+0

J'ai pensé à ViewState. C'est une différence d'assigner des valeurs qui seront sauvegardées dans ViewState (Init ou Load). Donc, si cela corrige votre problème, nous pouvons l'étudier en détail. Alors est-ce que c'est corrigé maintenant? – Danil

0

Probablement UpdatePanel provoque le problème. Je voudrais essayer de le retirer de UpdatePanel et verrait alors (ce que je crois qu'il devrait) si cela fonctionne? Deuxièmement, vous pouvez probablement remplir uniquement les éléments de liste Valeurs et textes uniquement, puis sous événement mnuMainMenu_MenuItemClick (expéditeur d'objet, MenuEventArgs e); Recherchez l'élément spécifique sur lequel vous avez cliqué (e.Item. * public properties), puis utilisez probablement Response.Redirect() pour effectuer le travail; Eh bien, juste à haute voix ...

+0

À propos de la première chose que vous avez raison. Ça marche. La deuxième chose, je le fais maintenant. Ma liste à puces contient un événement OnClick. Cette méthode contient le code suivant: BulletedList1.Items [e.Index] .Value; – Martijn

Questions connexes