2009-04-04 8 views
0

TCP 클라이언트에서 패킷을 받거나 보낼 때 메모를 사용하여 사용자에게 알리는 것이 핵심입니다. 이전 코드는 멍청했습니다. Timer는 폼 멤버 LOL에 액세스 할 수 있기 때문에 메모에 텍스트를 추가하는 데 사용되는 Timer를 사용했습니다.다른 클래스의 폼 멤버에 액세스

이전 코드 :

//Memo.Text += txt + "\n"; 
오늘 함께 연주

이 내가 코드를 그런 식으로 전화

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

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

를 Form1의 클래스에서

를 무슨 짓을했는지입니다 :

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

메모 difiers는 개인이지만 문제는 아닙니다.

문제는 코드를 호출 할 때 메모에 텍스트가 표시되지 않는다는 것입니다. 이 입력하여

답변

7

:

Form1 myForm = new Form1(); 

당신은 당신의 폼 (Form1)의 새 인스턴스를 만들 것이 아니라 당신이 가장 가능성이 이미 초기화 된 기존 인스턴스를 사용해야합니다 같아요. 그것을 할 수있는 방법

하나 :이 비록

var form = Form.ActiveForm as Form1; 

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

아주 좋은 디자인이 아니다. 대신 사용자 정의 events을 사용해보십시오.

+0

좋은 질문 - 오늘 새로운 소식통을 발견했습니다. –

0

메모가 컨트롤에서 상속 받고 적절한 수정 자로 설정한다고 가정하면 작업자 스레드 (TCP를 실행하는 데 사용되는 스레드)에서 텍스트를 설정하려고 할 가능성이 높습니다. 고객). 그렇다면 컨트롤의 InvokeRequired 필드를 확인하고 true이면 텍스트를 설정할 대리자를 호출해야합니다. 다음은 짧고 쉬운 C# 코드입니다.

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

아마도 tcpclient에 이벤트를 게시하는 것이 좋습니다. 그러면 양식에서이 이벤트를 청취하고 적절한 정보를 표시 할 수 있습니다.

관련 문제