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) の新しいインスタンスを作成しますが、代わりに、おそらく既に初期化されている既存のインスタンスを使用する必要があると思います。

それを行う方法の1つ:

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 に答える