0

关键是在 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";

备忘录修饰符是私有的,但这不是问题。

问题是当我调用代码时,备忘录上没有显示任何文本。

4

3 回答 3

7

通过输入:

Form1 myForm = new Form1();

您创建表单的新实例(Form1),但我想您应该使用最有可能已经初始化的现有实例。

一种方法:

var form = Form.ActiveForm as Form1;

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

虽然这不是很好的设计。尝试改用自定义events

于 2009-04-04T15:47:18.840 回答
1

也许你应该考虑在你的 tcpclient 中发布一个事件。然后您的表单将能够监听此事件并显示正确的信息。

于 2009-04-04T15:54:40.803 回答
0

假设 Memo 继承自 Control 并假设您使用适当的修饰符设置它,您可能遇到的问题是您可能试图从工作线程(用于运行 TCP 客户端的线程)设置文本。如果是这种情况,那么您需要检查控件的 InvokeRequired 字段,如果为 true,则调用将为您设置文本的委托。下面是一个简短的 C# 代码片段。

private void SetTextOnMemo(string txt){
    if(Memo.InvokeRequired){
        Memo.Invoke(SetTextOnMemo, txt);
    }
    else{
        Memo.Text = txt;
    }
}
于 2009-04-04T15:48:09.367 回答