我正在尝试为每个添加到表格的文本框添加一个唯一的名称。
我试过了:
TableRow someRow = new TableRow();
TableCell someCell = new TableCell();
TextBox someTextbox = new TextBox();
someTextbox.Attributes.Remove("name");
someTextbox.Attributes.Add("name",itsId);
someCell.Controls.Add(someTextBox);
someRow.Cells.Add(someCell);
theTable.Rows.Add(someRow);
生成的html包括我的名字和自动生成的名称作为文本框的属性。
不幸的是,当我以我的名义运行FindControl
时,我得到一个空引用,即使它仍然可以通过自动生成的名称找到它。
通过我的名字找到控件需要做什么?何时/为什么它会为我的控件自动生成名称?
成功的代码:
TextBox tb = (TextBox)FindControl(autogeneratedID); WriteToSomeOtherDiv(tb.Text);
代码不成功:
TextBox tb = (TextBox)FindControl(myId); WriteToSomeOtherDiv(tb.Text);
答案 0 :(得分:1)
这取决于ASP.Net的版本。从历史上看,您无法控制Id和控件的名称。在ASP.Net 4.0中,这种情况发生了变化。您可以控制Id的呈现方式。为什么不使用此功能呢?
以下是有关.Net 4.0中新功能的文章:http://www.dotnetfunda.com/articles/article893-control-over-client-ids--aspnet-40-.aspx
您是否有定位名称属性的原因?
如果您使用的是旧版本(3.5),则不是那么容易。 FindControl只查找控件的id,而不是名称。
答案 1 :(得分:0)
看起来您需要将控件放在占位符上,并在占位符而不是表单上找到该控件。请参阅下面有关删除和添加自定义控件和动态控件的示例,您需要先在其中找到控件,然后才能与其进行交互。要获得完整的解释,我可以在我的博客中找到它 - > http://anyrest.wordpress.com/2010/04/06/dynamically-removing-controls-in-a-parent-page-from-a-child-control/。如果这解决了您的问题,请告诉我。
public UserControl myCustomControl = new UserControl();
public Button myDynamicButton = new Button();
protected void btnAddControl_Click(object sender, EventArgs e)
{
myCustomControl = (UserControl)Page.LoadControl("SampleControlToLoad.ascx");
PlaceHolder myPlaceHolder = (PlaceHolder)Page.FindControl("PlaceHolder1");
myPlaceHolder.Controls.Add(myCustomControl);
}
protected void btnRemoveControl_Click(object sender, EventArgs e)
{
PlaceHolder myPlaceHolder = (PlaceHolder)Page.FindControl("PlaceHolder1");
if (myPlaceHolder.Controls.Contains(myCustomControl))
{
myPlaceHolder.Controls.Remove(myCustomControl);
myDynamicButton.Dispose();
}
}