2012-09-06 57 views
2

我正在c#中生成動態鏈接按鈕。點擊其中的任何一個,其他功能將被調用,將顯示哪個鏈接按鈕被點擊。但它不是在點擊呼叫的任何鏈接按鈕。鏈接按鈕的Click功能沒有被調用

這就是我如何產生它。

Int32 i; //create a integer variable 
for (i = 1; i <= 10; i++) // will generate 10 LinkButton 
{ 
LinkButton lb = new LinkButton(); //create instance of LinkButton 
lb.Text = Convert.ToString(i) + ""; //LinkButton Text 
lb.ID = Convert.ToString(i); // LinkButton ID’s 
lb.CommandArgument = Convert.ToString(i); // LinkButton CommandArgument 
lb.CommandName = Convert.ToString(i); // LinkButton CommanName 
lb.OnClientClick+= new CommandEventHandler(lb_Command); //Create Handler for it. 
//type lb.Command += and press double time Tab Key it will generat the lb_Command() code 
PlaceHolder1.Controls.Add(lb); // Adding the LinkButton in PlaceHolder 
} 

這是功能碼。

void lb_Command(object sender, CommandEventArgs e) 
{ 
Label1.Text = e.CommandName; // will display the which Linkbutton clicked 
Label1.Text = "aaaa"; 
// Response.Redirect(「LnkBtn.aspx?val=」 + Label1.Text); // you can also use as QueryString to send values to another page 
} 

請提供幫助。

謝謝。

+1

這不是任何地方下面提到的,但要確保你正在創建過程中的每一次的OnInit()階段重建這些按鈕後回來OFR您的活動贏得了無論如何,在頁面生命週期中儘早佈線以便工作。 –

+0

我在page_load的if(!IsPostBack)事件中產生它。 此外,當我點擊鏈接按鈕,所有鏈接按鈕得到消失爲什麼? – user1627138

+0

@ user1627138您不會在頁面生命週期中足夠早地創建按鈕。他們沒有被保存到視圖狀態,所以當你回發服務器時,不記得它有任何按鈕。正如Eoin所說的,您需要在'OnInit'事件中添加控件,並且您需要在每個頁面加載時執行它,而不僅僅是在'!IsPostBack'上。 – Servy

回答

3

您使用了錯誤的事件:

ClientClick是在javascript只是一個客戶端事件觸發。

你想要什麼Click Event

[...]

lb.Click += new CommandEventHandler(lb_Command); //Create Handler for it. 

如果您還沒有捕捉事件,那麼很可能你是在錯誤的時間在動態聲明你的LinkBut​​ton頁面生命週期(如Eoin Campbell在他的評論和他的回答中所提到的)。

他鏈接到article這真的很好,你應該閱讀它來理解爲什麼你沒有捕捉到事件。

根據您對您的問題和不同答案的評論來判斷,您在Page_Load函數中聲明瞭該按鈕。這是行不通的,因爲Page_Load在頁面生命週期中發生得太晚。

據我瞭解,現在您有:

void Page_Load(object sender, EventArgs e) 
{ 
    if(!Page.IsPostBack) 
    { 
      Int32 i; //create a integer variable 
      for (i = 1; i <= 10; i++) // will generate 10 LinkButton 
      { 
       LinkButton lb = new LinkButton(); //create instance of LinkButton 
       lb.Text = Convert.ToString(i) + ""; //LinkButton Text 
       lb.ID = Convert.ToString(i); // LinkButton ID’s 
       lb.CommandArgument = Convert.ToString(i); // LinkButton CommandArgument 
       lb.CommandName = Convert.ToString(i); // LinkButton CommanName 
       lb.OnClientClick+= new CommandEventHandler(lb_Command); //Create Handler for it. 
       PlaceHolder1.Controls.Add(lb); // Adding the LinkButton in PlaceHolder 
     } 
    } 
} 

你需要擺脫的那個。相反,使用:

void Page_Init(object sender, EventArgs e) 
{ 
    Int32 i; //create a integer variable 
    for (i = 1; i <= 10; i++) // will generate 10 LinkButton 
    { 
     LinkButton lb = new LinkButton(); //create instance of LinkButton 
     lb.Text = Convert.ToString(i) + ""; //LinkButton Text 
     lb.ID = Convert.ToString(i); // LinkButton ID’s 
     lb.CommandArgument = Convert.ToString(i); // LinkButton CommandArgument 
     lb.CommandName = Convert.ToString(i); // LinkButton CommanName 
     lb.OnClientClick+= new CommandEventHandler(lb_Command); //Create Handler for it. 
     PlaceHolder1.Controls.Add(lb); // Adding the LinkButton in PlaceHolder 
    } 
} 

上面鏈接的文章將解釋這是爲什麼。這是一個很難理解的問題,但卻是一個非常重要的概念。

+0

使用onclick給出了錯誤: - 錯誤'System.Web.UI.WebControls.LinkBut​​ton.OnClick(System .EventArgs)'由於其保護級別而無法訪問 – user1627138

+1

OnClientClick只是問題的一部分。就像你所說的那樣,即使使用了OnClick,他的代碼也只能在頁面生命週期中足夠早的時候生成這些按鈕。 –

+1

好吧,他沒有得到編譯錯誤首先。但他會繼續得到「奇怪的」運行時行爲,點擊他的按鈕時不會「出現」做任何事情。鑑於他正在製作OnClick vs.OnClientClick錯誤和誤解頁面生命週期在使用動態控件時很常見......是的......我認爲這是值得一提的。 –

0

代替下面的代碼

lb.OnClientClick+= new CommandEventHandler(lb_Command); //Create Handler for it. 

使用下面

lb.Command+= new CommandEventHandler(lb_Command); //Create Handler for it. 

以下是完整的代碼。它運行在我的最後。

protected void Page_Load(object sender, EventArgs e) 
    { 
     Int32 i; //create a integer variable 
     for (i = 1; i <= 10; i++) // will generate 10 LinkButton 
     { 
      LinkButton lb = new LinkButton(); //create instance of LinkButton 
      lb.Text = Convert.ToString(i) + "&nbsp;"; //LinkButton Text 
      lb.ID = Convert.ToString(i); // LinkButton ID’s 
      lb.CommandArgument = Convert.ToString(i); // LinkButton CommandArgument 
      lb.CommandName = Convert.ToString(i); // LinkButton CommanName 
      //lb.Click += lb_Click; //Create Handler for it. 
      lb.Command += lb_Command; 
      //type lb.Command += and press double time Tab Key it will generat the lb_Command() code 
      form1.Controls.Add(lb); // Adding the LinkButton in PlaceHolder 
     } 

    } 

    void lb_Command(object sender, CommandEventArgs e) 
    { 
     Label1.Text = e.CommandName; // will display the which Linkbutton clicked    
    } 

謝謝。

+0

我沒有辦法,但它沒有工作。 – user1627138

+0

然後請嘗試使用lb.Command + = lb_Command; – Nitesh

+0

lb_command函數沒有繼續點擊任何點擊後鏈接按鈕,當我點擊任何按鈕時,甚至所有的鏈接按鈕都不可見 奇怪的行爲 – user1627138

1

好的。兩件事情。正如其他人指出的那樣,您應該使用LinkButtonCommandClick處理程序。

但是你的第二個問題是,你正在運行到頁生命週期問題,通過嘗試只生成您的控件上

  1. 如果(!回發)在Page_Load

閱讀本:這是關於這個問題的非常好的文章可以追溯到所有的方式回到.NET 1 http://www.4guysfromrolla.com/articles/092904-1.aspx

簡而言之,你應該只是在創建控件每一次(不初始文章),並且您需要在頁面生命週期中足夠早地連接事件處理程序(+=部分),以便在PageLifeCycle嘗試觸發它們時連接事件。

覆蓋網頁的OnInit方法有移動你的代碼,而不if(!Postback)檢查

+0

事件不是'OnClick',它是'Click'。 – Servy

+0

單擊錯字固定... –