Найдите управление в веб-форме

Отладка (используйте ipython):

In [2]: s = 'asdfasdf asdf asdf asd sdfa'
In [4]: def count_words(sentence):
   ...:     count = 0
   ...:     last_position = 0
   ...:
   ...:     while sentence.find(" ", last_position) != -1:
   ...:         count += 1
   ...:         print(f'count: {count}, position: {last_position}')
   ...:         last_position = sentence.find(" ", last_position)
   ...:         print(f'new position: {last_position}')
   ...:         if count > 4:
   ...:             break
   ...:     return count
   ...:

In [5]: count_words(s)
count: 1, position: 0
new position: 8
count: 2, position: 8
new position: 8
count: 3, position: 8
new position: 8
count: 4, position: 8
new position: 8
count: 5, position: 8
new position: 8
Out[5]: 5

Узнайте, почему:

In [6]: s.find?
Docstring:
S.find(sub[, start[, end]]) -> int

Return the lowest index in S where substring sub is found,
such that sub is contained within S[start:end].  Optional
arguments start and end are interpreted as in slice notation.

Return -1 on failure.
Type:      builtin_function_or_method

Исправление:

In [7]: def count_words(sentence):
   ...:     count = 0
   ...:     last_position = 0
   ...:
   ...:     while sentence.find(" ", last_position) != -1:
   ...:         count += 1
   ...:         last_position = sentence.find(" ", last_position+1)
   ...:     return count
   ...:

In [8]: count_words(s)
Out[8]: 5
12
задан Mormegil 24 February 2014 в 12:59
поделиться

1 ответ

Проблема - то, что FindControl () не пересекает определенных детей управления, таких как шаблонный элемент управления. Если управление, которое Вы после жизней в шаблоне, это не будет найдено.

Таким образом, мы добавили следующие дополнительные методы для контакта с этим. Если Вы не используете 3.5 или хотите избежать дополнительных методов, Вы могли бы сделать библиотеку общего назначения из них.

Можно теперь получить контроль, который Вы после путем кодирования:

var button = Page.GetControl("MyButton") as Button;

Дополнительные методы делают рекурсивную работу для Вас.Надеюсь, это поможет!

public static IEnumerable<Control> Flatten(this ControlCollection controls)
{
    List<Control> list = new List<Control>();
    controls.Traverse(c => list.Add(c));
    return list;
}

public static IEnumerable<Control> Flatten(this ControlCollection controls,     
    Func<Control, bool> predicate)
{
    List<Control> list = new List<Control>();
    controls.Traverse(c => { if (predicate(c)) list.Add(c); });
    return list;
}

public static void Traverse(this ControlCollection controls, Action<Control> action)
{
    foreach (Control control in controls)
    {
        action(control);
        if (control.HasControls())
        {
            control.Controls.Traverse(action);
        }
    }
}

public static Control GetControl(this Control control, string id)
{
    return control.Controls.Flatten(c => c.ID == id).SingleOrDefault();
}

public static IEnumerable<Control> GetControls(this Control control)
{
    return control.Controls.Flatten();
}
26
ответ дан 2 December 2019 в 05:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: