在SharePoint页面上查找控件

时间:2011-10-24 20:08:17

标签: sharepoint sharepoint-2007

我试图找到位于我的SharePoint页面上的SPDataSource控件。我发现以下代码可能正常,我只是不知道要传递给它。

public static Control FindControlRecursive(Control Root, string Id)
{
    if (Root.ID == Id)
        return Root;

    foreach (Control Ctl in Root.Controls)
    {
        Control FoundCtl = FindControlRecursive(Ctl, Id);

        if (FoundCtl != null)
            return FoundCtl;
    }

    return null;
}

我不知道如何搜索整个页面或至少是控件所在的ContentPlaceHolder。

编辑

看起来我在这里有一个更基本的问题。不确定如何解释,但我没有在运行我的代码之前打开页面。我通过以下方式打开网站:

using (SPWeb web = thisSite.Site.OpenWeb("/siteurl/,true))

因此,当我尝试找到下面的页面时,我得到的对象引用未设置为对象的实例。

var page = HttpContext.Current.Handler as Page;

也许我正在以错误的方式解决这个问题,我现在处于起步阶段,所以我只是想弄清楚这些东西的绊脚石!

1 个答案:

答案 0 :(得分:1)

你得到的实际上不是特定于SharePoint的,它是c#asp.net。

无论如何,你可以这样称呼它

var page = HttpContext.Current.Handler as Page;
var control = page; // or put the element you know exist that omit (is a parent) of the element you want to find
var myElement = FindControlRecursive(control, "yourelement");

你很可能还需要投出回报

var myElement = (TextBox)FindControlRecursive(control, "yourelement");
// or
var myElement = FindControlRecursive(control, "yourelement") as TextBox;

然而,有更有效的方法来编写这样的方法,这里有一个简单的例子

public static Control FindControlRecursive(string id)
{
    var page = HttpContext.Current.Handler as Page;
    return FindControlRecursive(page, id);
}

public static Control FindControlRecursive(Control root, string id)
{
    return root.ID == id ? root : (from Control c in root.Controls select FindControlRecursive(c, id)).FirstOrDefault(t => t != null);
}

以我之前建议的方式调用它。

如果您处理较大的页面,上面的方法可能会有点慢,您应该做的是使用泛型的方法。它们比传统方法更快。

试试这个

public static T FindControlRecursive<T>(Control control, string controlID) where T : Control
{
    // Find the control.
    if (control != null)
    {
        Control foundControl = control.FindControl(controlID);
        if (foundControl != null)
        {
            // Return the Control
            return foundControl as T;
        }
        // Continue the search
        foreach (Control c in control.Controls)
        {
            foundControl = FindControlRecursive<T>(c, controlID);
            if (foundControl != null)
            {
                // Return the Control
                return foundControl as T;
            }
        }
    }
    return null;
}

你这样称呼它

var mytextBox = FindControlRecursive<TextBox>(Page, "mytextBox");