Ссылки на элементы Windows Form в других классах - PullRequest
4 голосов
/ 04 ноября 2010

Я очень новичок в программировании Windows Form и сталкиваюсь с проблемой.

У меня есть форма окна, Form1, с текстовым полем: tbx_Log.

В другом классе того же проекта я хочу что-то записать в текстовое поле журнала, но не могу сослаться на tbx_Log в этом классе Как мне этого добиться?

Ответы [ 5 ]

4 голосов
/ 04 ноября 2010

Доступ к объектам внутри других экземпляров классов (объектов) является плохим стилем и нарушает инкапсуляцию данных.Добавьте метод к Form1:

public void SetLogText(String text)
{
     tbx_Log.Text = text;
}

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

2 голосов
/ 04 ноября 2010

Я бы посоветовал вам создать метод в классе Form, который записывает в текстовое поле журнала.Затем вы передадите этот метод в качестве делегата (обратного вызова) вашему классу не-Form.Это дает вам больше гибкости в будущем.Например, если вы хотите вызвать один и тот же класс из другого класса, и вы хотите сделать что-то другое с информацией о журналировании, например записать ее в файл, то вы можете просто передать другую функцию обратного вызова.

2 голосов
/ 04 ноября 2010

Вам нужно либо сделать текстовое поле общедоступным (не рекомендуется), либо добавить в класс формы открытый метод, который будет записывать строку в текстовое поле (лучше).

public class Form1
{
    protected Textbox tbx_Log;
    public void Log(string str)
    {
        tbx_Log.Text += str + Environment.NewLine;
    }
}

public class Program
{
    private void DoStuff()
    {
        Form1 myForm = new Form1();
        //Make form visible, etc...
        myForm.Log("Test Log");
    }
}
1 голос
/ 04 ноября 2010

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

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

0 голосов
/ 04 ноября 2010

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

То, как другой класс обращается к вашему методу, зависит от того, как работает ваше приложение, и от отношений между классом формы и вашим другим классом.

public void SetText(string text)
{
    // InvokeRequired required compares the thread ID of the
    // calling thread to the thread ID of the creating thread.
    // If these threads are different, it returns true.
    if (this.textBox1.InvokeRequired)
    {    
        SetTextCallback d = new SetTextCallback(SetText);
        this.Invoke(d, new object[] { text });
    }
    else
    {
        this.tbx_Log.Text = text;
    }
}

Для получения полного примера и объяснения поточно-ориентированных вызовов в winforms проверьте MSDN , в котором также показано, как использовать BackgroundWorker для достижения безопасности потока, что является предпочтительнымспособ сделать это.

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