Поиск элемента управления на странице SharePoint - PullRequest
0 голосов
/ 25 октября 2011

Я пытаюсь найти элемент управления SPDataSource, расположенный на моей странице SharePoint. Я нашел следующий код, который, вероятно, работает нормально, я просто не знаю, что в него передать.

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 Ответ

1 голос
/ 25 октября 2011

То, что вы получили, на самом деле не относится к 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");

Скорее всего, вам понадобится разыгратьreturn также

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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...