在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;
}
答案 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é为什么会这样?这是母版页中的页面。