Доступ к текстовому полю из другого класса

Я хочу получить доступ к текстовому полю из другого класса.

Textbox1 должен быть доступен из класса Log, используя void AddLog.

Итак, в любом месте своего приложения я хочу использовать Log.AddLog("...."), чтобы добавить текст в окно журнала (textbox1), я написал для этого функцию (это AddLog):

public void AddLog(string s)
{
    new Form1().richTextBox1.Text += Environment.NewLine + s;
}

Я установил модификатор textbox1 на public, чтобы вызвать его из AddLog. Когда я вызываю эту функцию, ничего не происходит, в textbox1 ничего не отображается ....

Я уже искал, но ничего не нашел, что действительно помогло мне.


person Marco Bader    schedule 12.05.2015    source источник
comment
новый оператор - используется для создания объектов.   -  person Sayse    schedule 12.05.2015
comment
Насколько это поможет?   -  person Marco Bader    schedule 12.05.2015
comment
в новой форме текст richTextBox1 правильно добавлен к содержимому строки s, есть много повторяющихся вопросов о передаче объектов между классами, и мне трудно думать, что ничего не помогло .. что вы искали и что сделали вы пробовали, что не сработало?   -  person Sayse    schedule 12.05.2015
comment
Я не понял, что нашел. Не могли бы вы дать мне решение?   -  person Marco Bader    schedule 12.05.2015
comment
Мое решение будет таким же, как и те, которые вы уже нашли. Что из того, что вы пробовали до сих пор, не сработало?   -  person Sayse    schedule 12.05.2015
comment
Ничего, потому что я не знал, как это реализовать!   -  person Marco Bader    schedule 12.05.2015
comment
Я отредактировал ваш вопрос, чтобы удалить мой отрицательный голос, но, пожалуйста, прочтите Как задать вопрос. Я рекомендую вам попытаться решить вашу проблему самостоятельно, а затем вернуться с более подробным вопросом, если вы все еще застряли (Подсказка: передайте ссылку)   -  person Sayse    schedule 12.05.2015
comment
Я надеялся, что здесь мне помогут ...   -  person Marco Bader    schedule 12.05.2015
comment
Причина, по которой первый комментарий от @Sayse полезен, заключается в том, что ваш метод создает новый экземпляр Form1. Но как только метод завершается, этот экземпляр становится недоступным и удаляется. Ваше общее представление правильное, но вам нужно понимать объем. Два примера можно найти здесь и первую половину этот ответ.   -  person OhBeWise    schedule 12.05.2015


Ответы (3)


Попробуй это -

  public partial class Form1 : Form
  {
    Log log;
    public Form1()
    {
        InitializeComponent();
        log = new Log(richTextBox1);
    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    private void button1_Click(object sender, EventArgs e)
    {
        log.AddLog(DateTime.Now.ToString());
    }

    private void button2_Click(object sender, EventArgs e)
    {
        log.AddLog();
    }
}

public class Log
{
    RichTextBox rtb;
    public Log(RichTextBox rtb)
    {
        this.rtb = rtb;
    }

    public void AddLog(string msg)
    {
        rtb.Text += msg + Environment.NewLine;
    }

    public void AddLog()
    {
        rtb.Text += DateTime.Now.ToString() + Environment.NewLine;
    }
}

Это должно помочь. Вам необходимо передать ссылку на объект, который вы хотите изменить.

person Rohit    schedule 13.05.2015

Ваш текущий код структурирован так, что вы создаете new форму каждый раз, когда вызываете AddLog. Видна не существующая форма, а новая, которая не отображается. Вы добавляете содержимое переменной s в TextBox этой новой формы. Форма никогда не отображается, и, поскольку это локальная переменная, она имеет право на сборку мусора после завершения работы этого метода.

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

public class Log
{
    private Form1 _form;
    public Log(Form1 formToUpdate)
    {
        _form = formToUpdate;
    }

    public void AddLog(string s)
    {
        _form.richTextBox1.Text += Environment.NewLine + s;
    }
}

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

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

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

person Jeff B    schedule 12.05.2015
comment
Спасибо, а как это назвать? Я не могу назвать это Log.AddLog ()! - person Marco Bader; 12.05.2015
comment
Вы не предоставили нам достаточно информации. Кто будет создавать и владеть экземпляром класса Log? Вы не сказали нам, как вы хотите, чтобы это работало, и не показали код, который будет вызывать метод AddLog. Вы должны отредактировать свой вопрос, чтобы предоставить достаточную информацию и прояснить свой вопрос. - person Jeff B; 12.05.2015
comment
Хорошо. Я думал, что выразил это довольно ясно, но вот некоторые из моих мыслей: Log.cs - это класс. Я хочу использовать его как класс для записи в файл журнала (сделано на данный момент) и в текстовое поле в главном окне (это form1). Теперь я хочу получить доступ к Log.cs с помощью Log.AddLog (s) отовсюду, чтобы отображать какие-то сообщения, понимаете? - person Marco Bader; 12.05.2015
comment
Вы не можете вызвать метод AddLog из имени класса Log, поскольку это метод экземпляра. Вам нужно либо создать экземпляр (используя new), а затем передать эту ссылку всем, кто в ней нуждается, либо изменить его на статический метод (и, возможно, класс также будет статическим). Если вы не понимаете разницы между экземпляром и статическим методом, вам придется провести небольшое исследование. Это базовые концепции C #, абсолютно необходимо понять основы, прежде чем продолжить. - person Jeff B; 12.05.2015
comment
Вы также можете посмотреть видео 14: Понимание и создание классов и 15: Подробнее о классах и методах можно найти в Серия" Основы C #: Разработка для абсолютных новичков " на Channel 9 на MSDN. Удачи! :) - person Jeff B; 12.05.2015

new Form1().richTextBox1.Text += Environment.NewLine + s;

Означает, что вы создаете в форме новый richTextBox, а не текущий richTextBox1.

Должен быть

public void AddLog(string s)
{
    this.richTextBox1.Text += Environment.NewLine + s;
}
person anhtv13    schedule 13.05.2015
comment
Только если AddLog - это метод в форме, на котором есть RichTextBox. - person Jeff B; 13.05.2015