Прокрутка через текстовые поля
У меня есть приложение 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, мне нужно пройти через первичные элементы управления (панели), а затем прокрутить элементы управления на панелях. Он начинает усложняться.
Любые предложения о том, как я могу присвоить это значение текстовому поле?
Ответы
Ответ 1
Чтобы получить все элементы управления и подэлементы рекурсивно указанного типа, используйте этот метод расширения:
public static IEnumerable<TControl> GetChildControls<TControl>(this Control control) where TControl : Control
{
var children = (control.Controls != null) ? control.Controls.OfType<TControl>() : Enumerable.Empty<TControl>();
return children.SelectMany(c => GetChildControls<TControl>(c)).Concat(children);
}
использование:
var allTextBoxes = this.GetChildControls<TextBox>();
foreach (TextBox tb in allTextBoxes)
{
tb.Text = ...;
}
Ответ 2
Вы можете объединить все элементы управления в форме, задавая один за другим, если это "Текстовое поле", и верните полный список из них.
public List GetTextBoxes(){
var textBoxes = new List();
foreach (Control c in Controls){
if(c is TextBox){
textBoxes.add(c);
}
}
return textBoxes;
}
Ответ 3
Вы можете прокручивать текстовые поля в своей форме довольно простым способом:
Func<ControlCollection, List<TextBox>> SearchTextBoxes = null;
SearchTextBoxes = coll => {
List<TextBox> textBoxes = new List<TextBox>();
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-решение, конечно:)
Ответ 4
Перейдите через элементы управления в форме и проверьте имя элемента управления, если оно соответствует, а затем установите свойство Text, как вам нужно.
int i = 0;
foreach (Control contrl in this.Controls) {
if (contrl.Name == ("DateTextBox" + i.ToString())) {
contrl.Text = "requiredtexttobeset";
}
i = i + 1;
}
Ответ 5
Поскольку это сообщение, похоже, время от времени воскресает, и поскольку вышеприведенные решения не находят элементов управления внутри элементов управления, например, в групповом ящике, это найдет их. Просто добавьте свой тип управления:
public static IList<T> GetAllControls<T>(Control control) where T : Control
{
var lst = new List<T>();
foreach (Control item in control.Controls)
{
var ctr = item as T;
if (ctr != null)
lst.Add(ctr);
else
lst.AddRange(GetAllControls<T>(item));
}
return lst;
}
И он использует:
var listBoxes = GetAllControls<ListBox>(this);
foreach (ListBox lst in listBoxes)
{
//Do Something
}
Ответ 6
Если вы хотите обойтись без "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();
}
}
Ответ 7
//THE EASY WAY! Always post easy solutions. It 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;
}
}
}
Ответ 8
Вы можете просто сделать это приятель...
foreach (TextBox txt in this.Panel.Controls.OfType<TextBox>())
{
txt.Text="some value you assign";
}
Если ваши текстовые поля находятся на форме напрямую, а не на панели, вы можете заменить this.Panel.Controls
на this.Controls
. Это должно быть кратким и понятным для вас.
Ответ 9
После вызова InitialiseComponents()
добавьте текстовые поля в переменную члена коллекции в форме. Затем вы можете выполнить итерацию через них.
Ответ 10
Поскольку вы уже знаете имя элемента управления, вы можете искать элемент управления по его имени.
См. Получить элемент управления Windows Forms по имени на С#
Ответ 11
Вы можете создать Dictionary
из TextBox
, int
, как показано ниже:
Dictionary<TextBox, int> textBoxes = new Dictionary<TextBox, int>();
foreach (TextBox control in Controls.OfType<TextBox>())
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...
Удачи!
Ответ 12
Другие ответы просто не режут вас для вас?
Я нашел это как ответ на аналогичный вопрос о SO, но я не могу найти нить сейчас. Он рекурсивно проходит через ВСЕ элементы управления данного type
, которые расположены в пределах control
. Так включает детей детей детей из... и т.д. Мой пример изменяет ForeColor
каждого TextBox
на Hot Pink!
public IEnumerable<Control> GetAllControlsOfType(Control control, Type type)
{
var controls = control.Controls.Cast<Control>();
return controls.SelectMany(ctrl => GetAllControlsOfType(ctrl, type))
.Concat(controls)
.Where(c => c.GetType() == type);
}
Реализация:
IEnumerable<Control> allTxtBxs = GetAllControlsOfType(this, typeof(TextBox));
foreach (TextBox txtBx in allTxtBxs)
{
txtBx.ForeColor = Color.HotPink;
}
Совсем похоже на ответ abatishchev (который, для меня, только возвращал дочерние элементы первого уровня), но достаточно разный, чтобы заслужить его собственный ответ, я думаю.