Прокрутка через текстовые поля

У меня есть winforms приложение, на котором есть 37 текстовых полей на экране. Каждый из них последовательно пронумерован:

DateTextBox0 DateTextBox1 ... DateTextBox37 

Я пытаюсь выполнить итерацию через текстовые поля и присвоить значение каждому из них:

 int month = MonthYearPicker.Value.Month; int year = MonthYearPicker.Value.Year; int numberOfDays = DateTime.DaysInMonth(year, month); m_MonthStartDate = new DateTime(year, month, 1); m_MonthEndDate = new DateTime(year, month, numberOfDays); DayOfWeek monthStartDayOfWeek = m_MonthStartDate.DayOfWeek; int daysOffset = Math.Abs(DayOfWeek.Sunday - monthStartDayOfWeek); for (int i = 0; i <= (numberOfDays - 1); i++) { //Here is where I want to loop through the textboxes and assign values based on the 'i' value DateTextBox(daysOffset + i) = m_MonthStartDate.AddDays(i).Day.ToString(); } 

Позвольте мне пояснить, что эти текстовые поля появляются на отдельных панелях (37 из них). Поэтому для того, чтобы я мог выполнить цикл с использованием foreach, мне нужно пройти через первичные элементы управления (панели), а затем прокрутить элементы управления на панелях. Он начинает усложняться.

Любые предложения о том, как я могу присвоить это значение текстовому полю?

Чтобы получить все элементы управления и вспомогательные элементы рекурсивно указанного типа, используйте этот метод расширения:

 public static IEnumerable GetChildControls(this Control control) where TControl : Control { var children = (control.Controls != null) ? control.Controls.OfType() : Enumerable.Empty(); return children.SelectMany(c => GetChildControls(c)).Concat(children); } 

Применение:

 var allTextBoxes = this.GetChildControls(); foreach (TextBox tb in allTextBoxes) { tb.Text = ...; } 

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

 public List GetTextBoxes(){ var textBoxes = new List(); foreach (Control c in Controls){ if(c is TextBox){ textBoxes.add(c); } } return textBoxes; } 

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

 Func> SearchTextBoxes = null; SearchTextBoxes = coll => { List textBoxes = new List(); foreach (Control c in coll) { TextBox box = c as TextBox; if (box != null) textBoxes.Add(box); if (c.Controls.Count > 0) textBoxes.AddRange(SearchTextBoxes(c.Controls)); } return textBoxes; }; var tbs = SearchTextBoxes(this.Controls).OrderBy(tb => tb.Name); 

Изменить: изменено в соответствии с новыми требованиями. Конечно, не так элегантно, как LINQ-решение 🙂

Перейдите через элементы управления в форме и проверьте имя элемента управления, если оно соответствует, а затем установите свойство Text по вашему усмотрению.

 int i = 0; foreach (Control contrl in this.Controls) { if (contrl.Name == ("DateTextBox" + i.ToString())) { contrl.Text = "requiredtexttobeset"; } i = i + 1; } 

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

  public static IList GetAllControls(Control control) where T : Control { var lst = new List(); foreach (Control item in control.Controls) { var ctr = item as T; if (ctr != null) lst.Add(ctr); else lst.AddRange(GetAllControls(item)); } return lst; } 

И это использование:

  var listBoxes = GetAllControls(this); foreach (ListBox lst in listBoxes) { //Do Something } 

Если вы хотите обойтись без «foreach» (если у вас есть конкретные поля для настройки / адреса)

 int numControls = Page.Form.Controls.Count; for (int i = 0; i < numControls; i++) { if (Page.Form.Controls[i] is TextBox) { TextBox currBox = Page.Form.Controls[i] as TextBox; currbox.Text = currbox.TabIndex.ToString(); } } 
  //THE EASY WAY! Always post easy solutions. It's the best way. //This code is used to loop through all textboxes on a form for data validation. //If an empty textbox is found, Set the error provider for the appropriate textbox. foreach (var control in Controls) { if (control is TextBox) { //Box the control into a textbox. Not really needed, but do it anyway var textbox = (TextBox)control; if (String.IsNullOrWhiteSpace(textbox.Text)) { //Set the errorProvider for data validation errorProvider1.SetError(textbox, "Data Required!"); textbox.Text = String.Empty; //Clear out the whitespace if necessary //blnError = true; } } } 

Вы можете просто сделать это приятель …

 foreach (TextBox txt in this.Panel.Controls.OfType()) { txt.Text="some value you assign"; } 

Если ваши текстовые поля находятся в форме напрямую, а не на панели, то вы можете заменить this.Panel.Controls на this.Controls . Это должно быть коротко и достаточно ясно для вас.

После вызова InitialiseComponents() добавьте текстовые поля в переменную члена коллекции в форме. Затем вы можете перебирать их, чтобы позже.

Вы можете создать Dictionary TextBox , int как следующий

 Dictionary textBoxes = new Dictionary(); foreach (TextBox control in Controls.OfType()) textBoxes[control] = Convert.ToInt32(control.Name.Substring(11)); 

Теперь .. прокрутить их ..

 foreach (var item in textBoxes.Select(p => new { textBox = p.Key, no = p.Value})) item.textBox.Text = item.no.ToString(); // whatever you want... 

Удачи!

Поскольку вы уже знаете имя элемента управления, вы можете искать элемент управления по его имени.

См. Получение элемента управления Windows Forms по имени в C #

Другие ответы просто не режут его для вас?
Я нашел это как ответ на аналогичный вопрос о SO, но я не могу найти нить сейчас. Он рекурсивно перебирает все элементы управления определенного type которые находятся внутри элемента control . Так включает детей детей детей из … и т. Д. Мой пример изменяет ForeColor каждого TextBox на Hot Pink!

 public IEnumerable GetAllControlsOfType(Control control, Type type) { var controls = control.Controls.Cast(); return controls.SelectMany(ctrl => GetAllControlsOfType(ctrl, type)) .Concat(controls) .Where(c => c.GetType() == type); } 

Реализация:

 IEnumerable allTxtBxs = GetAllControlsOfType(this, typeof(TextBox)); foreach (TextBox txtBx in allTxtBxs) { txtBx.ForeColor = Color.HotPink; } 

Совсем похоже на ответ Абатищева (который, для меня , только возвращал контрольные элементы первого уровня ), но, по-моему , достаточно разный, чтобы заслужить его собственный ответ.

  • Как разместить текст на ProgressBar?
  • Как мы можем показать индикатор выполнения для загрузки с помощью FtpWebRequest
  • Открыть окно WPF в WindowsForm APP
  • Предварительный просмотр команд ZPL II с использованием .NET WinForm перед отправкой на принтер Zebra
  • Как заставить мою программу C # Winforms запускаться как администратор на любом компьютере?
  • Несколько streamов пользовательского интерфейса - Winforms
  • Показать дочернюю форму в центре родительской формы в C #
  • Двойная буферизация Winforms
  • ClickOnce и IsolatedStorage
  • Модель-View-Presenter в WinForms
  • Управляйте другим приложением с помощью C #
  • Interesting Posts

    Название центра панели инструментов Android и собственный шрифт

    Как я могу получить нагрузку процессора на kernel ​​в C #?

    Как предотвратить внедрение XPath / XML в .NET.

    Нет соответствующей функции – ifstream open ()

    Класс JavaLaunchHelper реализован в обоих. Один из двух будет использован. Какой из них не определен

    Условно перебрать один из нескольких возможных iteratorов

    Как легко изменить порядок строк в excel с помощью перетаскивания или перемещения или перемещения вниз?

    Как проверить загруженный файл в ASP.NET MVC?

    Общая ширина элемента (включая заполнение и границу) в jQuery

    Является ли этот ответ от компилятора действительным?

    Как переименовать набор файлов в командной строке Windows?

    Поддерживает ли HTML5 взаимодействие с локальными клиентскими файлами из браузера

    Mysql объединяет запрос для нескольких «тегов» (отношения «многие ко многим»), которые соответствуют всем тегам?

    NSDateFormatter показывает неправильный год

    Изменение фона popupMenu в Android

    Давайте будем гением компьютера.