2013-08-02 110 views
1

我想什麼:添加ASP控件以編程方式添加的內容

在理想的情況下,我將能夠創建具有oncommandcommandargument屬性的錨,但如果我沒有記錯,不工作,你必須創建一個控件,比如一個按鈕,它可以工作。然後我的問題來自於希望將該按鈕放置在頁面上的每個項目上,因爲我需要一些東西來添加控件,但是如果我創建了一個帶有runat="server"id="try"的錨點,我不能這麼做:try.Controls.Add(button)因爲'try'的錨點實際上還沒有創建。

背景:

大多數內容都以編程方式添加。一個stringbuilder被用來創建一個html頁面顯示的字符串。是否可以添加一個控件到頁面中間的這個字符串?或成爲一個以這種方式編程添加的元素?

我曾嘗試:

創建錨(或其它方式)和定位這些元件的id然後創建一個按鈕如下,但是,因爲該元素被編程方式添加並會有所不同,在id所需的數則s會try0,try1等:

var button = new Button { 
    CommandArgument = "test", 
    Text = "Try" 
}; 
button.Command += bt_sendMail_tryDevice_Click; 
try.Controls.Add(button); 

所以我嘗試以下,凡在我的aspx頁面我與id="try"這樣一個「虛擬」元素,它不抱怨的變化,但我明白爲什麼它不喜歡它,同時雖然我不知道如何解決它。 (tryCount是一個隨着每次迭代而增加以保持id唯一的int)。

this.FindControl(try.ToString() + tryCount.ToString()).Controls.Add(button); 
+0

'ASP:PlaceHolder'是專爲這種使用情況。在控件添加到它之前不會呈現(通常以編程方式)。 –

+0

但我無法以編程方式添加佔位符嗎?我目前在一個固定的位置使用了一個佔位符,但在這裏我需要另一個佔位符,用於頁面上的每一行。 – dudledok

+0

你是指「頁面上的每一行」是什麼意思?你有網格視圖嗎?中繼?你可以添加一個'LinkBut​​ton'到項目模板嗎? – Jay

回答

0

它有點難以告訴你要做什麼,但我會盡我所能去儘可能地接近我。首先,你需要一些控制來作爲「容器」工作。這可以是任何你喜歡的控制。在我測試這種情況下,我做了這樣的事情:

<div runat="server" id="ContainerDiv"></div> 

接下來你需要一種方法來管理你的ID。我這樣做是通過創建一個簡單的變量和方法,像這樣:

private int IdCount = 0; 
private string GetNewID() 
{ 
    return string.Format("try{0}", IdCount++); 
} 

現在你說你想要一個阿克爾標記,也有CommandNameCommandArgument一個LinkButton會做到這一點。您可以在上面這樣的LinkButton添加到您的div:

ContainerDiv.Controls.Add(
    new LinkButton() 
    { 
     ID = GetNewID(), 
     CommandName = "DoSomething", 
     CommandArgument = "arg", 
     Text= "Try Me", 
    }); 

顯然更換CommandName和你真正想要的值休息。請確保在分配ID時撥打GetNewID(),以便始終保持唯一。

控件可以添加到任何地方作爲現有服務器控件的子頁面,包括頁面本身,但這樣做可能會非常棘手。一定要儘快將它們添加到頁面中(在頁面生命週期中),因爲回發事件可能無法正常工作。

更新

保持引用到已建立自己的頁面上的元素可以簡化您的實現:

public partial class _Default : Page 
{ 
    Control containerDiv; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     this.containerDiv = SomeMethodThatCreatesADiv(); 
     this.Page.Controls.Add(containerDiv); 
    } 

    void SomeOtherMethod() 
    { 
     this.containerDiv.Controls.Add(
      new LinkButton() 
      { 
       ID = GetNewID(), 
       CommandName = "DoSomething", 
       CommandArgument = "arg", 
       Text= "Try Me", 
      }); 
    }  
} 
+0

這實際上正是我一直在嘗試,但我的問題是我不能瞄準的是編程的id的元素,即我想要從後面的代碼創建按鈕的div,因此我可以不要定位該div的id(儘管它在技術上是在它被定位之前創建的,但intellisense不知道) – dudledok

+0

嘗試保留對該div的引用,而不是通過ID查找它。我會更新我的回答 – Jay

+0

這裏發生了什麼? 'this.containerDiv = SomeMethodThatCreatesADiv();'+'this.Page.Controls.Add(containerDiv);' – dudledok

相關問題