Как передать ссылку на элемент управления WinForm классу при создании экземпляра этого класса? - PullRequest
0 голосов
/ 30 мая 2019

Как передать ссылку на объект формы (например, TextBox) в класс, чтобы я мог указать, с каким текстовым полем должен работать этот экземпляр при создании этого экземпляра?Конкретный пример: у меня есть класс, который обрабатывает некоторые текстовые строки.У меня есть несколько экземпляров этого класса.У меня также есть несколько текстовых полей в моей форме.У меня есть метод в классе, который показывает некоторый текст в текстовом поле.Что мне нужно сделать, чтобы сообщить конкретному экземпляру моего класса, какое текстовое поле использовать при создании этого экземпляра?Должно быть в конструкторе, что-то вроде:

public MyClass (строка textString, / ссылка на текстовое поле /)

Это мой класс:

 public class LogClass
{
    private readonly TextBox _textBox;

    private string logText; 
    public string LogText
    {
        get
        {
            return logText;
        }

        set
        {
            logText = value;
        }
    }

    public void AddToLog(string textString)
    {

        try
        {
            if (string.IsNullOrEmpty(textString))
            {
                throw new ArgumentException("message", nameof(textString));
            }
            logText = logText+ "\n" + textString;
            _textBox.Text = logText;

        }
        catch (Exception)
        {

            throw;
        }

    }

    public LogClass(string initialText, TextBox textBox)
    {
        logText = initialText;
        _textBox = textBox;
        _textBox.Text = logText;


    }
}

А это моя форма:

 public partial class LogWindow : Form
{

    LogClass myLog = new LogClass("this is initial string", logOutputBox);
    public LogWindow()
    {
        InitializeComponent();
    }

    public string LogTextToPass {
        get { return logOutputBox.Text; }
        set { logOutputBox.Text = value; }
    }

    private void buttonWriteLog_Click(object sender, EventArgs e)
    {
        myLog.AddToLog(inputText.Text);

    }

    private void logOutputBox_TextChanged(object sender, EventArgs e)
    {

    }
}

Ошибка CS0236 в этой строке:

    LogClass myLog = new LogClass("this is initial string", logOutputBox);

Ошибка CS0236 Инициализатор поля не может ссылаться на нестатическое поле, метод,или свойство LogWindow.logOutputBox выделено logOutputBox

Ответы [ 2 ]

1 голос
/ 30 мая 2019

Вы можете передать его любым удобным для вас способом.Аргумент конструктора кажется разумным, если класс не может использоваться без TextBox.В конструкторе вы можете подписаться на события TextBox.

class TextBoxHandler
{
    private readonly TextBox _textbox;

    public TextBoxHandler(TextBox textbox)
    {
        _textbox = textbox;
        _textbox.Click += HandleClick;
    }

    public void HandleClick(object sender, EventArgs e)
    {
        //Do something
    }
}
1 голос
/ 30 мая 2019

Это должно быть так же просто, как передать ссылку на него в конструкторе

Всякий раз, когда создается класс или структура, вызывается его конструктор. класс или структура могут иметь несколько конструкторов, которые принимают разные аргументы. Конструкторы позволяют программисту устанавливать значения по умолчанию, ограничьте создание экземпляров и напишите код, который будет гибким и простым для чтения.

public class MyLovelyHorse
{
   // private field of TextBox to play with internally
   private readonly TextBox _textbox;


   // constructor
   public MyLovelyHorse(TextBox textbox)
   {
      _textbox = textbox;
   }

   // some awesome method that does stuff
   public void SomeMethodThatDoesStuff()
   {
      _textbox.Text = "rah";
   }
}

Использование

var myLovelyHorse = new MyLovelyHorse(MyTextBox);

// do stuff
myLovelyHorse.SomeMethodThatDoesStuff(); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...