получить доступ к текстовому полю из любого места приложения - PullRequest
2 голосов
/ 06 мая 2009

Как создать текстовое поле в моем приложении winforms, которое принимает новые строки текста из любой точки приложения?

У меня есть основная форма, которая содержит текстовое поле. Я хотел бы напрямую добавить текст в поле из метода другого класса.

Обновление

Я попробовал это в моей основной форме:

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

Но я не могу вызвать Output из другого класса. Я новичок в C #, так что, возможно, я упускаю что-то очевидное.

С уважением, Миэль.

PS Да, я знаю, что это плохой дизайн, но сейчас это, кажется, лучший способ сделать то, что я хочу. Текстовое поле будет функционировать как консоль.

Ответы [ 4 ]

4 голосов
/ 06 мая 2009

Вам нужно будет указать свойство Text для TextBox как свойство string в вашей форме. Например ...

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

Редактировать

После прочтения вопроса редактирования ваша проблема заключается в том, что вам нужна ссылка на конкретный экземпляр формы везде, где вы пытаетесь выполнить этот код. Вы можете либо передать ссылку (что лучше), либо использовать какой-то вонючий код и иметь статическое свойство, которое ссылается на один экземпляр вашей формы. Что-то вроде ...

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

1 голос
/ 06 мая 2009

Чтобы развязать немного больше, вы можете немного изменить управление:

// 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 голосов
/ 06 мая 2009

Это ДЕЙСТВИТЕЛЬНО плохой способ сделать это, но просто чтобы убедиться, что все ответы там есть ...

В конструкторе VS каждый элемент управления формы имеет в окне свойств элемент с именем Modifiers, который по умолчанию равен Private. Изменение этого параметра на один из других параметров, например Internal или Public, позволит вам получить доступ к нему извне формы.

Я должен подчеркнуть, что это худший способ сделать это.

0 голосов
/ 06 мая 2009

Похоже, ваш дизайн немного испорчен. Вы не должны мешать бизнес-логике работать с элементами управления GUI. Почему бы вам не попробовать возвращаемое значение и присвоить его на стороне интерфейса?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...