C#ASP.NET使用动态名称访问文本框?

时间:2011-06-08 16:28:57

标签: c# .net asp.net

在c#中,如何使用动态变量名访问asp:textbox元素?我提供的代码由于某种原因不起作用。单击按钮时会调用createContact方法。 我正在进行som重构,也许我还应该动态添加文本域?

一些示例代码:

前:

<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;
}

5 个答案:

答案 0 :(得分: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;
}

您的textBoxes似乎没有真正的动态名称,您只想根据其他条件从特定文本框中获取值

答案 1 :(得分: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
}

答案 2 :(得分: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中以实现此目的。但是尝试将动态名称放入代码中似乎只是想要比必要更聪明,这通常会导致奇怪的错误和支持问题。

答案 3 :(得分: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)
...

答案 4 :(得分:0)

在我的具体情况下,我所要做的就是在前面的所有文本框周围添加一个占位符。然后而不是调用

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

我用过

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

所以出于某种原因,“这个”没有指向正确的地方。任何人都有一个idé为什么会这样?这是母版页中的页面。