Подтвердить что ты не робот

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

У меня есть приложение 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, мне нужно пройти через первичные элементы управления (панели), а затем прокрутить элементы управления на панелях. Он начинает усложняться.

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

4b9b3361

Ответ 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() добавьте текстовые поля в переменную члена коллекции в форме. Затем вы можете выполнить итерацию через них.

Ответ 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 (который, для меня, только возвращал дочерние элементы первого уровня), но достаточно разный, чтобы заслужить его собственный ответ, я думаю.