我开发了一个网络仪表板,其中嵌入了控件内部的控件结构。在许多情况下,我有一个控件的ID,需要处理实际的控件对象。因此,我使用一个实用方法,一个递归的FindControl实现,它搜索Page(或任何其他提供的对象,但我总是使用Page),作为控件的ID。
/// <summary>
/// Page.FindControl is not recursive by default.
/// </summary>
/// <param name="root"> Page </param>
/// <param name="id"> ID of control looking for. </param>
/// <returns> The control if found, else null. </returns>
public static Control FindControlRecursive(Control root, string id)
{
if (int.Equals(root.ID, id))
{
return root;
}
foreach (Control control in root.Controls)
{
Control foundControl = FindControlRecursive(control, id);
if (!object.Equals(foundControl,null))
{
return foundControl;
}
}
return null;
}
此功能可以变得非常慢。一旦我把log4net登录到它,我意识到有多慢。我现在正试图尽可能地离开它,但我不知道我有什么其他选择,如果有的话。
例如,用户将控件拖放到我的网页上。事件处理程序如下所示:
protected void RadListBox_Dropped(object sender, RadListBoxDroppedEventArgs e)
{
//e.HtmlElementID is the UniqueID of the control I want to work upon.
RadDockZone activeControlDockZone = Utilities.FindControlRecursive(Page, e.HtmlElementID) as RadDockZone;
}
无法保证此控件将成为Page的直接子节点,而我(据我所知!),我无法确定此控件在此控件中的位置,除非从向下搜索页面。
我唯一能想到的就是在页面上保留每个对象的查找表,但这似乎是错误的想法。
还有其他人遇到过这个问题吗?
答案 0 :(得分:2)
Hrm,这个怎么样...... HtmlElementID应该是控件的客户端ID,它应该是控件的完全限定位置。
这样的事情:
Page_Parent_0_Control_1
您可以分解ID字符串,然后通过将路径拼接在一起,从页面向下导航到相关控件。
Page findcontrol Page_Parent(index#0) Page_Parent_0 findcontrol Page_Parent_0_Control(index#1)
仍然不是最好的方法,但它可以帮助您避免对相关控件进行霰弹枪搜索。
希望这对你有用,或至少给你另一种看待问题的方法:)