Доступ к членам формы из другого класса

Дело в том, чтобы уведомить пользователя с помощью памятки, когда пакет получен/отправлен в TCP-клиенте. Старый код был очень глупым, я использовал таймер, который использовался для добавления текста в заметку, поскольку у таймера есть доступ к членам формы, лол.

Старый код:

//Memo.Text += txt + "\n";

Я играл с ним сегодня, вот что я сделал

В классе Form1

public string TextValue
{
    get
    {
        return Memo.Text;
    }

    set
    {
        this.Memo.Text += value + "\n";
    }
}    

Я вызываю код так:

Form1 myForm = new Form1();
myForm.TextValue = "test asdasd";

Модификаторы заметок являются личными, но проблема не в этом.

Проблема в том, что текст не отображается в заметке, когда я вызываю код.


person Ivan Prodanov    schedule 04.04.2009    source источник


Ответы (3)


Введя это:

Form1 myForm = new Form1();

вы создаете новый экземпляр своей формы (Form1), но вместо этого, я думаю, вам следует использовать существующий экземпляр, который, скорее всего, уже был инициализирован.

Один из способов сделать это:

var form = Form.ActiveForm as Form1;

if (form != null)
{
     form.TextValue = "test asdasd";
}

Хотя это не очень хороший дизайн. Вместо этого попробуйте использовать собственный events.

person Konstantin Tarkus    schedule 04.04.2009
comment
Хороший вопрос - сегодня я нашел несколько новых источников. - person David Robbins; 04.04.2009

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

person empi    schedule 04.04.2009

Предполагая, что Memo наследуется от Control, и предполагая, что вы установили его с правильным модификатором, проблема, с которой вы можете столкнуться, заключается в том, что вы, вероятно, пытаетесь установить текст из рабочего потока (того, который используется для запуска клиента TCP). Если это так, вам нужно проверить поле InvokeRequired вашего элемента управления и, если оно истинно, вызвать делегата, который установит текст для вас. Ниже приведен короткий и простой фрагмент C#.

private void SetTextOnMemo(string txt){
    if(Memo.InvokeRequired){
        Memo.Invoke(SetTextOnMemo, txt);
    }
    else{
        Memo.Text = txt;
    }
}
person em70    schedule 04.04.2009