2009-05-06 2 views
2

응용 프로그램의 어디서나 새로운 텍스트 행을 허용하는 winforms 응용 프로그램에서 텍스트 상자를 만들려면 어떻게해야합니까?응용 프로그램의 어디서나 텍스트 상자에 액세스 할 수 있습니다.

텍스트 상자가 포함 된 기본 폼이 있습니다. 다른 클래스의 메서드에서 상자에 텍스트를 직접 추가하고 싶습니다.

업데이트

내 주요 양식이 시도 :

public void Output(String value) 
    { 
     if (txtOutput.Text.Length > 0) 
     { 
      txtOutput.AppendText(Environment.NewLine); 
     } 
     txtOutput.AppendText(value); 
    } 

하지만 다른 클래스의 출력을 호출 할 수 없습니다. 나는 C#에 익숙하지 않기 때문에 아마도 뭔가 분명하지 않을 것입니다.

안부, Miel.

추신 : 예, 이것이 나쁜 디자인이라는 것을 알고 있지만, 지금은 이것이 내가 원하는 것을하는 가장 좋은 방법 인 것 같습니다. 텍스트 상자는 콘솔처럼 작동합니다.

답변

4

양식의 string 속성으로 속성을 TextBox에 노출해야합니다. 예를 들어 ... 편집

public string TextBoxText 
{ 
    get { return textBoxName.Text; } 
    set { textBoxName.Text = value; } 
} 

질문 편집을 읽은 후, 당신의 문제는 당신이 그 코드를 실행하려고하는 whereever 형태의 특정 인스턴스에 대한 참조를 필요로한다는 것이다. 참조를 전달할 수 있습니다 (더 나은 옵션) 또는 냄새 나는 코드를 사용할 수 있고 양식의 한 인스턴스를 참조하는 정적 속성을 가질 수 있습니다. 뭔가 같은 ...

public partial class MyForm : Form 
{ 
    private static MyForm instance; 

    public static MyForm Instance 
    { 
     get { return instance; } 
    } 

    public MyForm() : base() 
    { 
     InitializeComponent(); 

     // .... 

     instance = this; 
    } 
} 

이 방법을 사용하면 MyForm.Instance.Output("test");

+0

질문에서 OP는 한 번에 하나씩 선을 추가하려고합니다. 그래서 MultiLine이라고 생각합니다. –

+0

@Henk : 그리고 ...? 네가 무엇을 얻고 있는지 잘 모르겠다. –

+0

냄새 나는 코드는 이의가 아닙니다 ... – Miel

0

설계가 손상 약간은 마치를 호출 할 수 있습니다. GUI 컨트롤을 사용하여 비즈니스 논리를 엉망으로 만들어서는 안됩니다. 반환 값을 시도하고 인터페이스 측에 할당하면 어떨까요? 더 많이 제어를 조금 반전 할 수있는 비트를 분리하기 위해

+0

누가 비즈니스 로직이 업데이트를 수행한다고 말합니까? 왜 다른 UI 컨트롤이 될 수 없습니까? –

+0

"응용 프로그램의 어디에서나"라는 말은 사업 논리이기도하다는 것을 의미합니다. – Migol

1

:

// interface for exposing append method 
public interface IAppend 
{ 
    void AppendText(string text); 
} 

// some class that can use the IAppend interface 
public class SomeOtherClass 
{ 
    private IAppend _appendTarget = null; 

    public SomeOtherClass(IAppend appendTarget) 
    { 
     _appendTarget = appendTarget; 
    } 

    private void AppendText(string text) 
    { 
     if (_appendTarget != null) 
     { 
      _appendTarget.AppendText(text); 
     } 
    } 

    public void MethodThatWillWantToAppendText() 
    { 
     // do some stuff 
     this.AppendText("I will add this."); 
    } 

} 

// implementation of IAppend in the form 
void IAppend.AppendText(string text) 
{ 
    textBox1.AppendText(text); 
} 
+0

이상 처리 된 것 같습니다 –

+0

@ Adam; 있을 수 있습니다; 문제의 애플리케이션의 복잡성에 달려 있습니다. 그것은 하나의 형태, 수류의 클래스 애플 리케이션, 또는 여러 어셈블리, 클래스의 일종 애플 리케이션의 종류가 있습니까? 첫 번째 경우에는 지나치게 엔지니어링 된 것을, 후자의 경우 적절하다고 생각합니다. –

+0

@Fredrik 물론, 의견의 문제이지만, 후자의 경우에는 동일한 인터페이스에 여러 인스턴스를 전달하는 것보다 중앙 집중식 단일/정적 로거 방식을 사용하는 것이 더 적합 할 것으로 보입니다. YMMV. –

0

이이 일을 정말 나쁜 방법이지만, 단지 확인 모든 해답이 거기 밖으로 만들을 ...

VS 디자이너에서 각 폼 컨트롤의 속성 창에 이라는 항목이 있으며 기본값은 Private입니다. 이것을 Internal 또는 Public과 같은 다른 설정 중 하나로 변경하면 양식 외부에서 액세스 할 수 있습니다.

나는 이것이 가장 나쁜 방법이라고 강조해야합니다.

+0

... 그 이유는 제안해서는 안됩니다. 또한 폼에 전역 문자열 변수와 타이머를 폴링하여 구현할 수도 있습니다. 그렇다고해서 제안 할만한 가치가있는 것은 아닙니다 ... –

관련 문제