返回首页


我有张贴恶毒的原因。这是一个另一篇文章的先决条件,我想在JavaScript控制映射,当你有一个影响另一个的控制,有没有良好的面条,少的方式连接在一起。但首先,我要谈谈我的漂亮的FindControl扩展。你是否扩展方法,或者只是放置在页面的基类,你可能会发现这些方便。
我们所有使用的FindControl,并意识到这是一个非常懒惰的功能,只搜索其直接的儿童,而不是完全控制层次。让退一步跳到代码之前考虑一下我们的搜索。什么是控件层次结构?它是一个树形数据结构,其根节点是页。最常见的递归FindControl的扩展,开始在页或一个给定的父节点,并执行超过所有子节点的深度优先遍历。
{S0的}
搜索顺序为:A-B-D-H-E-I-J-C-F-K-G

/// <summary>

/// Recurse through the controls collection checking for the id

/// </summary>

/// <param name="control">The control we're checking</param>

/// <param name="id">The id to find</param>

/// <returns>The control, if found, or null</returns>

public static Control FindControlEx(this Control control, string id)

{

    //Check if this is the control we're looking for

    if (control.ID == id)

        return control;



    //Recurse through the child controls

    Control c = null;

    for (int i = 0; i < control.Controls.Count && c == null; i++)

        c = FindControlEx((Control)control.Controls[i], id);



    return c;

}


净上面的代码你会发现许多例子。这是"足够好??选择算法。如果你曾经想知道它的效率,阅读。关闭你的眼睛和图片看似无辜的形式的复杂性??每个表招致行招致细胞生在细胞内的控制等等。用不了多久,你意识到可能有一个相当复杂的控制层次结构,有时相当深厚,即使在一个相对简单的页面。
现在,想象与几个顶级的复合控制,他们中的一些呈现深的控制heirachies(如表)的页面。作为设计师你的页面里约内包含的控件的布局和结构的知识。因此,你可以选择搜索的数据结构的最佳方法。看上面的图和想象的更为复杂和深刻的B-分支。现在说什么,我们试图找到克。你会随着深度优先搜索移动到C-分支,并最终找到控制在G之前的B-分支entiretly。对于这种情况,广度优先搜索会更有意义,因为我们不会浪费时间寻找一个复杂的和潜在的深分支,当我们知道控制是我们的出发点,根。
{S}
搜索顺序为:A-B-C-D-E-F-G-H-I-J-K{C}
最近我有这样一个场景,我需要2控制链接在一起,在一个中继的ItemTemplate共存。控件中存在不同的复合控件。
{S2的}
在这个例子中,我需要得到的ClientID _TexBoxPerformAction启用/它禁用通过_ChechBoxEnable的。对数据的大小取决于中继器绑定到那里可能有数百个中继的ItemTemplate的实例。我如何保证我得到正确的呢?上述自上而下的FindControl算法将返回他的第一匹配_TextBoxPerformAction的,不一定是正确的。为了解决这一困境,我们需要一种自下而上的方法,找到最接近我们的控制。我们的工作了控制层次结构的方式,我们应该能够找到文本框,在相同的ItemTemplate例如低保,我们有权利。问题是,作为我们工作的路上,我们将反复寻找一个越来越大的分支,我们已经看到。我们需要修剪的子分支,我们已经看到了,所以我们不搜索了一遍,因为我们的工作方式。
开始,我们是在节点5和需要去找到我们的控制节点1。我们递归搜索节点产生任何结果。
{S3的}
接下来我们看看节点5的父。我们已经搜查节点5,所以我们将它修剪。现在递归搜索节点,包括节点3,产生任何结果。
{四至}
的下一步wenbsp;看看atnbsp;节点的父。我们已经搜查节点4和它的孩子,所以我们修剪它。
{五}
最后,我们递归搜索节点,包括节点1,产生的结果!
{六}
所以在这里我们可以看到,修剪,救了我们反复搜索整个分支。和最好的部分是,我们只需要保持一个ID修剪的轨道。
/// <summary>

/// Finds the control from the leaf node to root node.

/// </summary>

/// <param name="ctrlSource">The control we're checking</param>

/// <param name="id">The id to find</param>

/// <returns>If found, the control.  Otherwise null</returns>

public static Control FindControlLeafToRoot(this Control ctrlSource, string id)

{

    Control ctrlParent = ctrlSource.Parent;

    Control ctrlTarget = null;

    string pruneId     = null;



    while (ctrlParent != null &&

           ctrlTarget == null)

    {

        ctrlTarget     = FindControl(ctrlParent, id, pruneId);

        pruneId        = ctrlParent.ClientID;

        ctrlParent     = ctrlParent.Parent;

    }

    return ctrlTarget;

}



/// <summary>

/// Recurse through the controls collection checking for the id

/// </summary>

/// <param name="control">The control we're checking</param>

/// <param name="id">The id to find</param>

/// <param name="pruneClientID">The client ID to prune from the search.</param>

/// <returns>If found, the control.  Otherwise null</returns>

public static Control FindControlEx(this Control control, string id, string pruneClientID)

{

    //Check if this is the control we're looking for

    if (control.ID == id)

        return control;



    //Recurse through the child controls

    Control c = null;

    for (int i = 0; i < control.Controls.Count && c == null; i++)

    {

        if (control.Controls[i].ClientID != pruneClientID)

            c = FindControlEx((Control)control.Controls[i], id, pruneClientID);

    }



    return c;

}


现在,我们必须寻找不浪费我们来自搜索子分支周期叶根的一个高效的算法。所有这一切使我头脑jQuery的强大的选择功能。我做梦也没想到它的一个原因,但寻找一个控件集合,很容易实施和jQuery的领先后,我们可以延长上述搜索远远超过只是一个ID。
{S14系列}

回答

评论会员:InfRes 时间:2012/02/06
简单而有效的
评论会员:理查德推定 时间:2012/02/06
{C3的}
]已返回控制,所以你并不需要,演员:

{的C4}

"看着这些人,我的灵魂深处,并指派我根据我加入的顺序数字。"
  ; - 荷马