2012-07-05 18 views
1

在Page_Load方法中,我根據各種條件創建了幾個控件。我想用這些控件註冊服務器端代碼。但是,對於最後一部分,我需要將我的控件聲明爲服務器控件。這通常由runat = server完成,但我不知道如何在C#代碼中設置此屬性。 myControl.Attributes.Add(「runat」,「服務器」)沒有辦法。這一個工作,這意味着,當我點擊它的「測試」方法被調用:ASP:runat =用於動態控制的服務器

<asp:LinkButton ID="LinkButton1" runat="server" OnClick="test">testtext</asp:LinkButton> 

這一個不工作:

  LinkButton lb = new LinkButton(); 
      lb.ID = "LinkButton1"; 
      lb.OnClientClick = "test"; 
      lb.Text = "testtext"; 
      lb.Attributes.Add("runat", "server"); 

我可以點擊它,而頁面加載,但測試方法不被調用。

任何提示?

回答

3

你幾乎說得對。只是幾件事:

  • 當您手動實例化服務器控件時,不需要添加runat="server"屬性。這是一個特殊的屬性,只有ASP.NET頁面解析器才能將服務器控件與其他標記區分開來。
  • 標記中的OnClick屬性對應於Click服務器端事件,您可以使用+=運算符進行連接。(在另一方面,在標記中的OnClientClick屬性對應於onclick客戶端屬性,它通常包含的JavaScript代碼片段。該OnClick不對應於onclick事實是無可否認有點混亂。)

這樣:

LinkButton lb = new LinkButton(); 
lb.ID = "LinkButton1"; 
lb.Click += test; 
lb.Text = "testtext"; 

而且你的事件處理程序(你甚至可以使private如果沒有引用從標記到它):

protected void test(object sender, EventArgs e) 
{ 
} 
+0

是的,謝謝。這樣可行。現在,如果我添加一個常規按鈕(),點擊我以前的linkbutton不會觸發任何事情(無頁面加載)。如果asp:Button不在頁面上,則所有內容都像魅力一樣。任何線索? – Jan

+0

當你說LinkBut​​ton沒有觸發任何東西時,是否意味着頁面仍然刷新(但LinkBut​​ton的事件處理程序沒有被調用),還是頁面根本不刷新?此外,您將LinkBut​​ton添加到頁面的方法是什麼? –

+0

我在Page_Load中添加了LinkBut​​ton。 asp:Button位於.aspx文件中。是的,頁面根本不刷新。只要我刪除了asp:Button,一切都像以前一樣工作。 – Jan

0

你不需要。由於控件是通過C#代碼在服務器端創建的,它們已經是服務器端控件。您遇到的問題與頁面生命週期有關:當您在服務器端創建控件時,您需要在每次回發時重新添加控件,並重新綁定任何要處理的事件處理程序爲他們。

另外請注意,您的代碼顯示了兩種不同的東西:對,你貼了,您要顯示的處理程序OnClick事件,而在C#代碼要添加的處理程序OnClientClick事件的標記。他們是兩件不同的事情。當點擊控件時,OnClientClick事件只會觸發您頁面上的任何JavaScript代碼。這是完全一樣的這樣做:

link.Attributes.Add("onclick","SomeJavascriptFunction();"); 
0

首先,你不需要那麼lb.Attributes.Add("runat", "server")線。所有runat="server"確實是使控件對代碼隱藏可見。由於您在代碼隱藏中添加了控件,這是一個有爭議的問題。

至於腳本,請注意,工作的是使用 OnClick和你破碎的一個是使用 OnClientClick。區別很重要,因爲 OnClick本身就是由javascript理解的,它會找到名稱爲 test的函數並執行它。

OnClientClick另一方面,是ASP.NET運行時手動綁定到單擊事件的任意javascript。意思是,它只是執行test。沒什麼。另一方面,test()是正確的JavaScript。

因此,該行更改爲 lb.OnClickClick = "test()";

編輯:我是混合自己了,看到其他的答案。

2

您是否在嘗試註冊服務器端事件?如果是這樣,你可以這樣做。

LinkButton lb = new LinkButton(); 
lb.ID = "LinkButton1"; 
lb.Click += new EventHandler(LinkButton1_Click); 
lb.Text = "testtext"; 

事件

protected void LinkButton1_Click(object sender, EventArgs e) 
{ 

}