Несколько файлов .cs и доступ к форме - PullRequest
0 голосов
/ 20 декабря 2010

Я пытаюсь написать свою первую программу на C # без использования учебника. Чтобы с самого начала использовать хорошие методы кодирования, я хочу создать каждый класс в отдельном файле .cs. Однако у меня возникают некоторые проблемы при попытке доступа к элементам программы в таком файле .cs.

Например, у меня есть Form1.cs с меткой и кнопкой «Пуск». При нажатии на кнопку запуска, текст должен появиться в метке. Итак:

В Form1.cs У меня есть:

namespace TestProgram
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void startButton_Click(object sender, EventArgs e)
        {
            WriteToLabel message = new WriteToLabel();
            message.WelcomeMessage();
        }
    }
}

И в моем отдельном WriteToLabel.cs файле:

namespace TestProgram
{
    public class WriteToLabel
    {
        public void WelcomeMessage()
        {
            Form1 myForm = new Form1();
            //myForm..  --> myForm doesn't have an 'outputLabel'?
            outputLabel.Text = "Welcome!"; // This returns an error: 'The name outputLabel does not exits in the current context'.
        }
    }
}

'outputLabel' - это (Имя), которое я дал метке, и это соответствует имени в Form1.Designer.cs. Оба файла используют одни и те же компоненты, такие как «using System»; Однако из моего файла WriteToLabel.cs я не могу получить доступ к Форме, содержащей мою программу. Мне удалось создать различные файлы .cs в консольном приложении, что только добавило мне путаницы. Итак, у меня два вопроса:

Первый , как я могу получить доступ к Форме из отдельного класса (т.е. не частичного класса) в отдельном файле? Второй , это хороший способ сделать это или неэффективно создавать несколько экземпляров разных классов?

Любые мысли или идеи приветствуются

С уважением,

Ответы [ 3 ]

2 голосов
/ 20 декабря 2010

Дизайнер автоматически создает элементы управления как частные поля, из-за чего ваш класс WriteToLabel не может получить к нему доступ. Вы должны изменить это. Также хорошим началом было бы изменить класс на что-то вроде этого:

namespace TestProgram
{
    public class WriteToLabel
    {
        Form1 form;

        public WriteToLabel(Form1 form)
        {
            this.form = form;
        }

        public void WelcomeMessage()
        {
            //Form1 myForm = new Form1();
            //myForm..  --> myForm doesn't have an 'outputLabel'?
            form.outputLabel.Text = "Welcome!";
        }
    }
}
2 голосов
/ 20 декабря 2010

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

public void WelcomeMessage(Form1 form)
{
    form.outputLabel.Text = "Welcome";
}

Вам также необходимо убедиться, что outputLabel является публичным (или внутренним) свойством / полем Form1, чтобы вы могли установить значение соответствующим образом. Тогда код вызова немного отличается:

private void startButton_Click(object sender, EventArgs e)
{
    WriteToLabel message = new WriteToLabel();
    message.WelcomeMessage(this);
}
1 голос
/ 20 декабря 2010

Вы должны убедиться, что Form1.outputLabel имеет публичную или внутреннюю видимость.

Вам нужно что-то вроде класса LabelWriter, только если класс будет совместно использовать значительное количество государственных или частных методов.Если все, что у вас есть, это набор методов, которые устанавливают свойства для отдельных объектов, вы можете просто оставить его как метод для того же объекта (в данном случае объект Form1):

void startButton_Click(object sender, EventArgs e)
    {
        displayWelcomeMessage();
    }

void displayWelcomeMessage()
    {
       this.outputLabel = "Welcome!";
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...