创建此类的实例时,如何将对WinForm控件的引用传递给类?

时间:2019-05-29 23:24:33

标签: c# winforms

如何将对表单对象(即TextBox)的引用传递给类,以便在创建此实例时可以指定此实例需要使用哪个文本框? 具体的例子: 我有一个处理一些文本字符串的类。我有几个此类的实例。 我的表单上也没有几个文本框。我在类中有一个方法,可在文本框中显示一些文本。创建该实例时,我该怎么做才能告诉类的特定实例?应该在构造函数中,例如:

公共MyClass(字符串textString,/ 引用到文本框 /)

这是我的课程:

id(A[:])

这是我的表格:

 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;


    }
}

错误CS0236在此行上:

 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字段初始化程序无法引用非静态字段,方法或属性'LogWindow.logOutputBox' logOutputBox突出显示

2 个答案:

答案 0 :(得分:1)

它应该像在Constructor

中传递对其的引用一样简单
  

无论何时创建类或结构,都将调用其构造函数。一种   类或结构可能具有多个采用不同构造函数的构造函数   论点。构造函数使程序员可以设置默认值,   限制实例化,并编写灵活且易于阅读的代码。

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

答案 1 :(得分:1)

您可以按照任何想要的方式传递它。如果没有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
    }
}