Использование динамически созданных элементов управления в C # - PullRequest
4 голосов
/ 12 января 2011

Я создаю приложение, в котором пользователь вводит оценки, а программа выводит средневзвешенное значение.При загрузке будет запрошено количество категорий для заданий.Затем программа будет динамически создавать текстовые поля для ввода пользователем информации.Проблема в том, что я не могу понять, как читать текст, который вводится после создания текстовых полей.Вот мой код:

            TextBox txtbx = new TextBox();
            txtbx.Text = "";
            txtbx.Name = "txtbx1";
            txtbx.Location = new Point(10, 10);
            txtbx.Height = 20;
            txtbx.Width = 50;
            Controls.Add(txtbx);

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

Ответы [ 5 ]

13 голосов
/ 12 января 2011

Если вы динамически генерируете элементы управления, то, очевидно, вы не сможете создать поле для каждого из них.Но если вы пытаетесь получить доступ к коллекции Controls для именованного элемента управления, ControlCollection может быть проиндексирован по имени.После добавления текстового поля с указанным именем вы можете просто сделать:

TextBox txtbx = (TextBox)Controls["txtbx1"];
3 голосов
/ 12 марта 2014

Этот код для динамического добавления текстового поля при нажатии кнопки

int count = 1;
public System.Windows.Forms.TextBox AddNewTextBox()
    {
        System.Windows.Forms.TextBox txt = new System.Windows.Forms.TextBox();
        this.Controls.Add(txt);
        txt.Top = count * 25;
        txt.Left = 100;
        txt.Text = "TextBox " + this.count.ToString();
        count = count + 1;
        return txt;
    }
private void Onbutton_Click(object sender, EventArgs e)
    {
      //Call the method AddNewTextBox that uses for Dynamically create Textbox
        AddNewTextBox();
    }

Надеюсь, этот код поможет вам. Благодарю вас Удачного кодирования:)

3 голосов
/ 12 января 2011

Вы можете использовать метод FindControl класса Page.

Этот метод принимает параметр, который является идентификатором TextBox, который необходимо установить при создании:

txtbx.ID = "txtbx1";

Затем вы можете выбрать его:

TextBox txtbx1 = (TextBox)FindControl("txtbx1");

и использовать его.


Редактировать: После первоначального вопросадобавил, что он ссылается на Windows Forms, мой ответ выше не по теме.

В Windows Forms вы должны просто использовать переменную члена класса вместо локальной переменной.Например:

public partial class MyForm
{
    ...

    private TextBox txtbx;

    ...

    private void createControls()
    {
        txtbx = new TextBox();
        txtbx.Text = "";
        txtbx.Name = "txtbx1";
        txtbx.Location = new Point(10, 10);
        txtbx.Height = 20;
        txtbx.Width = 50;
        Controls.Add(txtbx);
    }

    private void someOtherFunction()
    {
        // Do something other with the created text box.
        txtbx.Text = "abc";
    }
}
1 голос
/ 12 января 2011

Храните список ссылок всех текстовых полей в форме. Добавьте ссылку textBox в список при их динамическом создании.

Затем вы можете просто перебирать все текстовые поля в списке, когда хотите прочитать их текст.

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

class MyForm : Form
{
    IList<TextBox> _textBoxes = new List<TextBox>();

    private void AddTextBox(string categoryName){

        var myTextBox = new TextBox();
        myTextBox .Name = categoryName + "txtbx";

        // set other properties and add to Form.Controls collection

        _textBoxes.Add(myTextBox);
    }

    private TextBox FindTextBox(string categoryName)
    {
        return _textBoxes.Where( t => t.Name.StartsWith(categoryName)).FirstOrDefault();
    }
}
0 голосов
/ 12 января 2011

Все, что вам нужно сделать, это настроить прослушиватель OnClick для вашей кнопки отправки и заставить его сделать что-то подобное

private void OnSubmit(object sender, EventArgs args)
{
    string yourText = txtbx.Text;
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...