如何在c#中命名和查找动态创建的webcontrols

时间:2010-08-10 22:30:10

标签: c# asp.net dynamic controls dynamic-controls

我正在尝试为每个添加到表格的文本框添加一个唯一的名称。

我试过了:

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

2 个答案:

答案 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();
    }
}