Отладка (используйте 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
Проблема - то, что 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();
}