2013-03-20 70 views
0

我的問題是,我在動態創建的cell.its工作正常,但動態鏈接按鈕的點擊事件處理程序不創建動態鏈接按鈕。已經在互聯網上搜索了足夠的東西,但沒有什麼工作......在頁面加載中調用一種方法,然後調用創建動態單元格和鏈接按鈕的方法。但仍然點擊事件不會觸發...即使oninit不會工作,因爲我的項目的結構是這樣的。有沒有其他的解決方案this.im調用頁面加載方法做一些工作,並調用此創建方法。動態鏈接按鈕(創建在動態表格單元格)事件不會觸發

 protected void create() 
     { 

     for (int j = 0; j < 8; j++) 
     { 
     Label lbl; 
     LinkButton lnk; 
     TableRow tRow = new TableRow(); 
     for (int i = 0; i < 6; i++) 
     { 
      TableCell tCellLessonPlan = new TableCell(); 
      lbl = new Label(); 

      lnk = new LinkButton(); 


       lnk.Click += new System.EventHandler(this.LinkButton_Click); 


       lbl.Text = "Period"; 
       lnk.Text = "Details"; 
       tCellLessonPlan = createCell(tCellLessonPlan.Text); 
       tCellLessonPlan.Controls.Add(lbl); 
       tCellLessonPlan.Controls.Add(lnk); 
       tRow.Cells.Add(tCellLessonPlan); 

     } 
     Table1.Rows.Add(tRow); 
    } 
} 

    protected TableCell createCell(string cellText) 
{ 
    TableCell tCell = new TableCell(); 
    Unit height = new Unit(20, UnitType.Pixel); 
    tCell.Height = height; 
    Unit width = new Unit(190, UnitType.Pixel); 
    tCell.Width = width; 
    tCell.BorderStyle = BorderStyle.Solid; 
    tCell.BorderColor = System.Drawing.Color.Black; 
    tCell.BorderWidth = Unit.Point(2); 

    tCell.Text = cellText; 
    return tCell; 

} 


protected void LinkButton_Click(object sender, EventArgs e) 
{ 
    LinkButton lnk = (LinkButton)sender; 
    //Some logic here. 
} 

回答

3

從你粘貼的代碼,事實上,你說它是從Page_Load或更早的時候調用這應該工作。您可能省略了一些重要的代碼。爲了調試這個

  1. 打開網頁
  2. 查看源代碼,並找到自己的按鈕,並檢查它的ID
  3. 設置在Page_Load中
  4. 斷點點擊按鈕
  5. 查看Request.Form和檢查按鈕ID是從客戶端發佈

這是可能的,你是不是總是產生相同的控制,而他們得到的不同基於此的ID。當第一次渲染按鈕和發生PostBack時,您需要確保ID不會有所不同。爲此,請在服務器端設置按鈕及其父母的ID。


如何ASP.NET事件工作

網站是無狀態的用戶界面。這意味着服務器會產生顯示給用戶的輸出,而不再關心它們。爲了處理用戶對某些工作的請求,用戶瀏覽器向服務器發送信息。處理事件也是如此。爲了讓服務器知道哪個事件需要處理,它必須創建所有控件,然後檢查哪些用戶發送的數據,並查看哪個控件用戶以他的操作爲目標。可以理解的是,必須儘早創建控件,以便服務器可以查找它們併爲它們查找事件處理程序。

頁面生命週期有幾個階段。生命週期在用戶瀏覽器向服務器發送請求時開始,並在服務器輸出響應該請求時結束。在用戶瀏覽器完全加載頁面時,服務器不再知道它。一旦點擊了將數據發送回服務器的按鈕,服務器將再次創建基於頁面的頁面,並且頁面會經歷另一個生命週期。生命週期階段是:

  1. 頁面請求 - 在這個階段沒有被創建頁面,只有從客戶端請求已收到。
  2. 開始 - 進行頁面的基本預處理。檢查是否要求回覆或不回覆。
  3. 初始化 - 控制已經在這一點上被創建,但視圖狀態和後回到數據尚未處理尚未
  4. 負載 - 控制信息從視圖狀態恢復和控制狀態
  5. 回發事件處理 - 回傳....事件處理
  6. 渲染 - 查看和控制狀態保存,Render被每一個信息控制下控制樹
  7. 卸載 - 請求被丟棄

正如你可能已經猜到了3,4和5對你很重要。您應該在初始化階段或最新加載階段創建控件,因爲在下一階段回發事件處理完成。

服務器如何知道要調用哪個事件處理程序?用戶回覆找到觸發事件的控制所需的所有信息,以及事件本身。這些數據取決於控制類型。

採取以下例如代碼:

protected void Page_Load(object sender, EventArgs e) 
{ 
    CreateControls(); 
} 

public void CreateControls() 
{ 
    LinkButton linkBtn = new LinkButton(); 
    linkBtn.ID = "btnTest"; 
    linkBtn.Text = "test"; 
    linkBtn.Click += new EventHandler(btn_Click); 
    pnl.Controls.Add(linkBtn); 

    Button btn = new Button(); 
    btn.ID = "btnTest2"; 
    btn.Text = "test"; 
    btn.Click += new EventHandler(btn_Click); 
    pnl.Controls.Add(btn); 
} 

在這裏,我們動態地添加控制和附加的事件處理程序。下面是請求的數據怎麼說用戶發送長相當頁第一次呈現,如: Request data on first run

當用戶點擊LinkButton,頁面再次處理,用戶發送的附加信息的頁面,看看需要做什麼: Request data after LinkButton is clicked 用戶瀏覽器在__EVENTTARGET密鑰下發送表單數據中的控制ID。服務器檢查是否設置了__EVENTTARGET,並且它是否知道需要處理事件。這發生在從上面的階段5。服務器查找控件並觸發它是默認事件(如果是LinkButtonButton,則爲Click)。

類似的事情發生了Button控制: Request data after Button is clicked 此時,控制ID被作爲形式數據的密鑰值。在表單數據中,在該鍵下是代表按鈕的html元素value(在我們的示例中,值爲test,因爲這是按鈕文本)。


這應該足以瞭解如何在ASP.NET中處理事件的基礎知識。現在據此,在Page_Load中放置一個斷點,檢查Request.Form["__EVENTTARGET"]並查看它是否已設置。如果已設置,請檢查您的控件是否已在此時創建,是否具有相同的ID以及是否附加了事件處理程序。如果事件仍未觸發,那麼您要麼在請求生命週期的第5階段之前刪除該控件(或其父項)或分離事件處理程序。

+0

我試過你說的Nikola.but它仍然沒有工作。我已經設置了每個鏈接按鈕的id,像this.lnk.ID = i.tostring()+ j.tostring(); ..現在它爲每個鏈接按鈕採取diffidid ..但它仍然沒有觸發事件。 – DividesByZero 2013-03-20 09:53:28

+0

當你點擊按鈕時,你檢查了什麼回傳嗎?首次創建時控件的ID是什麼,當用戶點擊它並創建頁面回覆後創建它時,它是什麼ID? – 2013-03-20 09:56:20

+0

是的,我正在檢查ids.all ids是不同的.prob是它沒有處理鏈接按鈕event.the頁面回來一旦linkbutton被點擊和所有控制vanishes.im真的堅持在這 – DividesByZero 2013-03-20 11:16:11