2017-02-07 11 views
1

поэтому я использовал control.find некоторое время, и он работает как шарм. Мне нравится понимать то, что я использую.C# control.find описание

Control txt = this.Controls.Find(x + "_" + y + "_" + z, true)[0] as TextBox;

txt.Text = string.Empty;

Выше приведен пример одного из способов я использовать этот метод, где х, у, г имеют тип int (или даже string иногда), она работает очень хорошо с моими процедурно созданными элементами управления, так как у меня их так много, и некоторые мои методы требуют определенного текстового поля для доступа.

MSDN - Control.Find, в основном очень простой относительно этого метода, за исключением одной вещи, которая подводит меня к моему вопросу.

[0]: этот badboy, где я пытаюсь улучшить свое понимание этого метода.

Я всегда оставил его как есть, так как метод бомбит, если его удалили. Я хотел бы знать, по крайней мере, 3 вещи, все остальное было бы бонусом в отношении [0], во-первых, что это такое, почему это так и какие возможные полезные сценарии существуют для этого парня?

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

ответ

3

ControlCollection.Find возвращает Control[], поэтому возможно несколько элементов управления. Причина в том, что вы можете иметь несколько элементов управления в форме с тем же именем.

Ваш второй параметр - bool, который вы установили на true. Он указывает, должен ли этот элемент управления искать рекурсивно или только в родительском элементе управления.

Таким образом, ваш код безопасен, если у вас никогда не было двух элементов управления с тем же именем.

В противном случае вы должны

  1. избежать дублирования имен
  2. или, если необходимо, использовать цикл для перебора этих элементов управления вместо accesssing только первый

Обратите внимание, что вы можете» t добавлять элементы управления с тем же именем через конструктор, который обнаруживает дубликаты имен. Но вы можете свободно добавлять элементы управления с тем же именем.

+0

всех моих элементов управления имеют уникальные имена, все они генерируются в течение циклов с заданными границами; я не понимаю, как эффективно использовать [0] –

+0

@JuanPike: что значит эффективно? Доступ к элементу в массиве с помощью индекса очень эффективен –

+0

Да, они очень эффективны, но я имею в виду добавление к ним большего количества элементов управления, а затем доступ к ним из массива, когда он мне нужен. –

2

что это, почему это там

Если вы посмотрите на возвращаемое значение: Control[] метода Find, вы видите, что он возвращает массив всех возможных совпадений. с [0] вы берете первый элемент. Вы также можете получить доступ к первому элементу с помощью

this.Controls.Find(x + "_" + y + "_" + z, true).First() as TextBox; 

EDIT: эта версия выше не действительно сохраняет.Более безопасный вариант будет проверить, действительно ли найдено совпадение:

Control[] asd = this.Controls.Find(x + "_" + y + "_" + z, true); 

if(asd.Any()) // if you have found any elements 
{ 
    TextBox t = asd.First() as TextBox; 
    t.Text = "Whatever"; 
} 

Если вы хотите получить несколько элементов управления одного и того же типа можно использовать OfType метод:

List<Button> asd = this.Controls.OfType<Button>().ToList(); 

Это поможет вам все Button в вашей форме.

Imaginge случай, когда у вас есть 10 кнопок и 4 из них имеют особое окончание в имени (возможно, для сохранения различных форматов), как:

btn_save_txt
btn_save_dat
btn_save_xml
...

Если вы хотите найти все кнопки с похожим именем, которое вы могли бы использовать это:

List<Button> asd = this.Controls.OfType<Button>().Where(x => x.Name.Contains("save")).ToList(); 

Теперь это даст вам только кнопки, которые предназначены для сохранения

+0

, это означает, что я могу загрузить несколько элементов управления в массив? –

+0

Да, но с помощью метода «Найти», только если элементы управления имеют все то же имя, как уже объяснил Тим Шмельтер.Ключевой параметр ищет только точные совпадения. –

+0

@JuanPike Я отредактировал свой ответ и добавил возможность поиска нескольких элементов управления, а также с неспецифическими именами. Посмотрите –