Доступ к членам формы из другого класса - PullRequest
0 голосов
/ 04 апреля 2009

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

Старый код:

//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";

Модификаторы памятки private , но это не проблема.

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

Ответы [ 3 ]

7 голосов
/ 04 апреля 2009

Набрав это:

Form1 myForm = new Form1();

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

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

var form = Form.ActiveForm as Form1;

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

Хотя это не очень хороший дизайн. Попробуйте использовать пользовательские <strong>events</strong> вместо.

1 голос
/ 04 апреля 2009

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

0 голосов
/ 04 апреля 2009

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

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