2009-10-07 2 views
0

В моем коде я создаю пункты меню динамически:C# asp.net Почему мое руководство __doPostBack запускается только один раз?

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++; 

} 

Это меню находится внутри панели обновления:

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

То, что я хочу, когда ListItem щелкают он выполняет обратную передачу. Но когда я запускаю это, событие onclick запускается только один раз.

Например. У меня есть 4 списка. Когда я нажимаю первый элемент при первом запуске события onclick. Теперь я нажимаю на второй элемент, также выполняется событие onclick. Но когда я теперь снова нажимаю на первый элемент, событие onclick не запускается.

Когда я проверяю консоль ошибок в FireFox или Oprah, я не получаю никаких ошибок.

Так что мой вопрос: как я могу исправить это и что я делаю неправильно?

ответ

1

Кажется, вам нужно переустановить его после обратной передачи. Где вы добавляете элементы в меню и проверяете ли вы свойство IsPostBack? Пожалуйста, сравните html после первой загрузки и postpack, чтобы увидеть, исчезает ли _dopostback.

Тогда попробуйте удалить проверку IsPostBack. Мой код работает хорошо. Вот оно.

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

В моей page_load у меня есть проверка на isPostBack. Если есть что-то вроде if (! IsPostBack) {build menu}. __doPostBack не исчезает – Martijn

+0

Thnx для ответа, но почему вы используете OnInit, а не Page_Load? – Martijn

+0

Я думал о ViewState. Разница заключается в том, где назначать значения, которые будут сохранены в ViewState (в Init или Load). Поэтому, если он исправит вашу проблему, мы сможем подробно изучить ее. Так теперь это исправлено? – Danil

0

Возможно, UpdatePanel вызывает проблемы. Я бы попытался вытащить его из UpdatePanel, а потом увижу (что, я считаю, должен), если это работает?

Во-вторых, вы можете, вероятно, просто заполнить элементы списка только значениями и текстами, а затем под событием mnuMainMenu_MenuItemClick (object sender, MenuEventArgs e); найдите конкретный элемент, который был нажат (e.Item. * общедоступные свойства), а затем, вероятно, будет использовать Response.Redirect() для выполнения задания; ну, просто думая вслух ...

+0

О первом, что вы правы. Это работает. Во-вторых, я делаю это сейчас. Мой список бюллетеней содержит событие OnClick. Этот метод содержит следующий код: BulletedList1.Items [e.Index] .Value; – Martijn

Смежные вопросы