C#引用了另一个类中的文本框

本文关键字:文本 引用 另一个 | 更新日期: 2023-09-27 18:04:41

C#新增,所以请注意。。。

我正在尝试使用以下代码将一些文本发送到表单文本框:

设置Form.cs

 namespace BluMote
 {
      public partial class SettingsForm : Form
      {
           public void send2Display(string whatWasSent)
           {
               this.rtbDisplay.Text = whatWasSent;
           }
           private void cmdOpen_Click(object sender, EventArgs e)
           {
               commToy.Parity = "None";
               commToy.StopBits = "One";
               commToy.DataBits = "8";
               commToy.BaudRate = "115000";
               commToy.PortName = "COM4";
               commToy.OpenPort();
           }
      .........
      }
 }

我(试着(从另一个类这样称呼它:

namespace PCComm
{
    class CommunicationManager
    {
    #region OpenPort
    public bool OpenPort()
    {
        try
        {
            if (comPort.IsOpen == true) comPort.Close();
            comPort.BaudRate = int.Parse(_baudRate);
            comPort.DataBits = int.Parse(_dataBits);
            comPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits), _stopBits);
            comPort.Parity = (Parity)Enum.Parse(typeof(Parity), _parity);
            comPort.PortName = _portName;
            comPort.Open();
            PCComm.frmMain form = new PCComm.frmMain();
            form.send2Display("test");
            return true;
        }
        catch (Exception ex)
        {
            DisplayData(MessageType.Error, ex.Message);
            return false;
        }
    }
    #endregion
}
}

并且文本框字段中不显示"测试">

但正如你所看到的,它不起作用。。。我错过了什么?

David

C#引用了另一个类中的文本框

send2Display是一个方法,您需要用参数来调用它,而不是分配给它。

BluMote.SettingsForm form = new BluMote.SettingsForm();
form.send2Display("test");

编辑:

如果从SettingsForm类内部调用该方法,则不需要创建新实例。尝试:

this.send2Display("test");

EDIT基于更新的问题:

问题是,您在OpenPort((中创建的表单不是屏幕上显示的表单,因此对文本框的任何更新都不会显示在屏幕上。以下是一些快速而肮脏的补救方法:

  • 将对文本框的引用传递到方法中。我不推荐这种方法,因为您最终会在模型中发现视图依赖关系
  • 从OpenPort((返回一个字符串,并将返回值传递给sendToDisplay
  • 在CommunicationManager中定义字符串类型的属性LastMessage,并在OpenPort((中为其赋值。然后在SettingsForm中读取它,并将其值传递给sendToDisplay

你必须有一个表单对象的实例才能做到这一点,比如:

BluMote.SettingsForm form = new BluMote.SettingsForm();
form.Show()
form.send2Display("test");
BluMote.SettingsForm.send2display = "test";

应为:

BluMote.SettingsForm form = new BluMote.SettingsForm();
form.Show();
form.send2Display("test");

但这会创建一个新实例,可能不是您想要的。您想要更改当前显示的表单上的文本,因此需要将该方法需要执行的实例传递到OpenPort方法中:

namespace PCComm
{
    class CommunicationManager
    {
    #region OpenPort
    public bool OpenPort(BluMote.SettingsForm form)
    {
        try
        {
            if (comPort.IsOpen == true) comPort.Close();
            comPort.BaudRate = int.Parse(_baudRate);
            comPort.DataBits = int.Parse(_dataBits);
            comPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits), _stopBits);
            comPort.Parity = (Parity)Enum.Parse(typeof(Parity), _parity);
            comPort.PortName = _portName;
            comPort.Open();
            //PCComm.frmMain form = new PCComm.frmMain();
            form.send2Display("test");
            return true;
        }
        catch (Exception ex)
        {
            DisplayData(MessageType.Error, ex.Message);
            return false;
        }
    }
    #endregion
}
}

然后,在Form1中的某个地方(比如加载事件(,您需要实例化依赖于它的类

CommunicationManager comm = new CommunicationManager();
comm.OpenPort(this);

您的代码中几乎没有问题。

  1. 调用类似于属性的方法。

    BluMote.SettingsForm.send2display="测试";//这是错误的

  2. 尝试从另一个类访问SettingsForm类成员,就像访问静态成员一样。

首先,您必须将SettingsForm实例解析为"其他类"。

//In Other Class
private SettingsForm settingsForm;
// Get the instance as a parameter in Constructor (this is one of options)
public OtherClass(SettingsForm instanceOfSettingsForm)
{
    settingsForm = instanceOfSettingsForm;
}
//Now you can call send2Display method from OtherClass
settingsForm.send2Display("Test");

您可以更改下面的代码,看看它是否有效:

public void send2Display(string whatWasSent)
{
     this.rtbDisplay.Text = whatWasSent;
     this.rtbDisplay.refresh();
}