Использование управления из отдельного класса в C # - PullRequest
0 голосов
/ 12 января 2011

У меня есть программа, которая динамически создает элементы управления при запуске, она прекрасно работает, когда код для этого находится в классе реальной формы. Я попытался переместить код в отдельный класс и обнаружил, что не могу использовать Controls.Add (). Как я могу добавить элементы управления в форму из отдельного класса? Это то, что я до сих пор:

            TextBox txtbx = new TextBox();
            txtbx.Text = "asd" + x.ToString();
            txtbx.Name = "txtbx" + x.ToString();
            txtbx.Location = new Point(10, (20 * x));
            txtbx.Height = 20;
            txtbx.Width = 50;
            Controls.Add(txtbx);

Ошибка 1 Имя «Controls» не существует в текущем контексте

Ответы [ 2 ]

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

Controls на самом деле является свойством, предоставляемым классом Control (и, следовательно, классом Form, поскольку он наследуется от Control), и представляет коллекцию всех элементов управления.которые были добавлены к этому конкретному экземпляру класса формы.

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

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

public void AddControls(Form frm)
{
    TextBox txtbx = new TextBox();
    txtbx.Text = "asd" + x.ToString();
    txtbx.Name = "txtbx" + x.ToString();
    txtbx.Location = new Point(10, (20 * x));
    txtbx.Height = 20;
    txtbx.Width = 50;
    frm.Controls.Add(txtbx);
}

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

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

Вам нужна ссылка на форму как минимум.В вашем классе Program.cs вы можете хранить ссылку на основную форму, например:

public class Program {

    public static Form MainForm;

    public static void Main() {
        ...
        MainForm = new Form1();
        Application.Run(MainForm);

    }

}

Затем, чтобы добавить элементы управления в основную форму, вы можете сделать:

Program.MainForm.Controls.Add(txtbx);

Конечноэто ставит совершенно другую проблему тесной связи между вашими классами таким образом, но из вопроса звучит так, будто вы новичок в Windows Forms или .NET, поэтому пока нет смысла обсуждать эту проблему.

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