我试图找到位于我的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;
也许我正在以错误的方式解决这个问题,我现在处于起步阶段,所以我只是想弄清楚这些东西的绊脚石!
答案 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");