C #: Как я могу добавить текст в текстовое поле на форме из класса? - PullRequest
1 голос
/ 26 января 2010

У меня есть форма с именем «Form1.cs», которая вызывает класс, который мы будем называть «Class1.cs», а также другую форму с именем «Form2.cs». Подпрограмма в Class1 должна обновить текстовое поле в Form2, если эта форма открыта. Текст должен появиться после его добавления к текущему тексту в текстовом поле, чтобы он обновлялся в режиме реального времени. Я не могу понять, как заставить это работать. Я перепробовал много вещей, и они не дают мне ошибок, но они также не записывают текст в текстовое поле.

Для каждого запроса здесь указан мой текущий код. Имейте в виду, что это тестовый проект для выяснения этого перед его реализацией.

Код в Form1.cs

namespace Test
{
    public partial class Form1 : Form
    {
        Form2 cs_form2 = new Form2();
        Class1 cs_class1 = new Class1();
        public Form1()
        {
            InitializeComponent();

        }
        public void button1_Click(object sender, EventArgs e)
        {
            cs_class1.Writelog();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            cs_form2.Show();
        }
        public void writeToTextbox()
            {
                i = 0;
                while(i<=10)
                {
                    cs_form2.testTextBox.AppendText("still works");
                    i++;
                }
            }
    }
}

Код в Form2.cs

namespace Test
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void clear_Click(object sender, EventArgs e)
        {

            testTextBox.Text = "";
        }

        public void AppendText()
        {
            testTextBox.AppendText("asklvhslieh");
        }
    }
}

Код в Class1

namespace Test
{
    class Class1
    {
        Form2 cs_form2 = new Form2();

        public void Writelog()
        {
            cs_form2.testTextBox.AppendText("asg");
        }
    }
}

1 Ответ

4 голосов
/ 26 января 2010

РЕДАКТИРОВАТЬ : При написании new Form2() ваш код в Class1 создает новый экземпляр Form2.
Этот экземпляр не имеет ничего общего с другим экземпляром, созданным в Form1 (также с помощью записи new Form2()), который фактически видим.
Вам нужно указать Class1 существующий экземпляр Form2, возможно, используя статическое свойство (как описано ниже).


Pre-Edit

Чтобы добавить текст в текстовое поле, вы должны вызвать метод AppendText.

Чтобы сделать это вне Form2, вы должны создать public метод для Form2, который вызывает AppendText.

Например:

partial class Form2 : Form {
    ...
    public void AppendMyText(string text) {
        myTextbox.AppendText(text);
    }
    ...
}

Чтобы вызвать этот метод в Class1, вам потребуется ссылка на объект Form2.
Если у вас есть только один Form2 за раз, вы можете создать статическое свойство, например так:

partial class Form2 : Form {
    static Form2 instance;
    public static Form2 Instance { get { return instance; } }

    protected override void OnShown(EventArgs e) {
        base.OnShown(e);
        instance = this;
    }

    protected override void OnClosed(EventArgs e) {
        base.OnClosed(e);
        instance = null;
    }

В Class1 (или в любом другом месте) вы можете написать

if (Form2.Instance != null)
    Form2.Instance.AppendMyText(someString);

Обратите внимание, что вам нужно сделать это в потоке пользовательского интерфейса; если вы работаете в фоновом потоке, вы можете позвонить BeginInvoke.

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