2011-06-08 40 views
0

在c#中,如何訪問帶有動態變量名稱的asp:textbox元素?我提供的代碼由於某種原因不工作。方法createContact在按鈕單擊時調用。 我做索姆重構,也許我也應該動態地添加文本域?具有動態名稱的C#ASP.NET訪問文本框?

一些示例代碼:

前:

<asp:TextBox runat="server" ID="OwnerFirstName" class="handleLongField"></asp:TextBox> 
<asp:TextBox runat="server" ID="OwnerLastName" class="handleLongField"></asp:TextBox> 
<asp:TextBox runat="server" ID="AdminFirstName" class="handleLongField"></asp:TextBox> 
<asp:TextBox runat="server" ID="AdminLastName" class="handleLongField"></asp:TextBox> 
and more of this kind 

後面的代碼:

public bool createContact(CONTACT_ROLES role) 
{ 
    String prefix = ""; 
    switch(role) 
    { 
     case CONTACT_ROLES.ADMIN : 
      prefix = "Admin"; 
      break; 
     case CONTACT_ROLES.OWNER : 
      prefix = "Owner"; 
      break; 
     case CONTACT_ROLES.BILLING : 
      prefix = "Billing"; 
      break; 
     case CONTACT_ROLES.TECH : 
      prefix = "Tech"; 
      break; 
    } 


    Contact contact = new Contact(); 
    contact.firstName = ((TextBox)this.FindControl(prefix + "FirstName")).Text; 
    contact.lastName = ((TextBox)this.FindControl(prefix + "LastName").Text; 
} 

回答

0

在我的特定情況下,所有我哈得做的是在前面加一個佔位符周圍所有的文本框,然後而不是調用

contact.firstName = ((TextBox)this.FindControl(prefix + "FirstName")).Text; 

我用

contact.firstName = ((TextBox)myPlaceHolder.FindControl(prefix + "FirstName")).Text; 

所以,由於某種原因,「這個」 didnt點到正確的位置。任何人都有一個idé爲什麼是這樣?這是主頁面中的頁面。

+0

'FindControl'不是遞歸的。意思是,如果您有一個面板並在其中添加控件,您將無法訪問「Page.FindControl」中的該控件。你必須像'this.Page.myPanel.FindControl'那樣做。沒有在masterpage上試過,但也許通過使用'this.Form.FindControl'你可以找到你正在尋找的控件。 – Kamyar 2011-06-09 08:15:45

1

我不認爲你需要的FindControl這裏,因爲這些文本框都存在在頁面上本身並不在頁面上的控件中。

嘗試以下操作:

private Control FindControlByName(string name) 
{ 
    foreach (Control c in this.Controls) //assuming this is a Form 
    { 
     if (c.Name == name) 
     return c; //found 
    } 
    return null; //not found 
} 
+0

我知道,但是如何通過動態變量名稱訪問它們呢? =) – Marthin 2011-06-08 16:36:20

2

你能做到這一點,而不是:

public bool createContact(CONTACT_ROLES role) 
{ 
    Contact contact = new Contact(); 
    String prefix = ""; 
    string firstName; 
    string lastName; 
    switch(role) 
    { 
     case CONTACT_ROLES.ADMIN : 
      firstName = AdminFirstName.Text; 
      lastName= AdminLastName.Text; 
      break; 
     case CONTACT_ROLES.OWNER : 
      firstName = OwnerFirstName.Text; 
      lastName= OwnerLastName.Text; 
      break; 
     //and so on.... 
    } 



    contact.firstName = firstName ; 
    contact.lastName = lastName; 
} 

它似乎並不像你真的有你的動態文本框的名字,你只是想獲得的值從特定的文本框基於其他標準

1

老實說,在提供的例子中,它看起來像動態名稱的需要是過度工程的結果。如果控件本身是靜態的,那麼訪問它們的代碼應該也是靜態的。該switch結構,來電來FindControl等方面都似乎是剛剛從已知控制建設的對象不必要的鈍替代:

var adminContact = new Contact(); 
adminContact.firstName = AdminFirstName.Text; 
adminContact.lastName = AdminLastName.Text; 

var ownerContact = new Contact(); 
ownerContact.firstName = OwnerFirstName.Text; 
ownerContact.lastName = OwnerLastName.Text; 

等等

如果你真的真的需要在任何時候只能創建一個Contact,那麼你可以將這些組包裝在switch中。但是,試圖將動態名稱放入代碼中似乎只是一種嘗試,而不是必要的,這往往會導致奇怪的錯誤和支持問題。

+0

問題是,我們有很多形式和名稱,基本上有6個相同代碼的副本,因爲我說這是對一些舊代碼的重構。 – Marthin 2011-06-09 06:47:22

1

其他人提到你不需要使用動態名稱。但是如果您有興趣,請按照以下步驟操作:
如果您在加載事件中創建控件並將它們添加到頁面中,則在訪問它們的方法中不會有智能感知。例如你創建了控制:如果你想有機會獲得回傳後,這種控制

var txtFirstName = new TextBox(); 
txtFirstName.ID = prefix + "FirstName"; 
this.Page.Form.Controls.Add(txtFirstName); 

,你必須在你的Page_Load事件再次創建它(這意味着你不應該限制在if (!IsPostback)條件,那麼您可以訪問在你網頁的任何方法控制如下:

TextBox txtFirstName = this.Page.Form.FindControl(prefix + "FirstName") as TextBox; 
if(txtFirstName != null) 
...