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

时间:2011-08-08 03:45:04

标签: c# textbox reference

C#的新人很好......

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

SettingsForm.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
}
}

“测试”不会显示在文本框字段中

但正如你所看到的,它不起作用......我缺少什么?

大卫

5 个答案:

答案 0 :(得分:4)

send2Display是一种方法,您需要使用参数调用它,而不是赋值给它。

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

编辑:

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

this.send2Display("test");

编辑基于更新的问题:

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

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

答案 1 :(得分:3)

您必须有一个表单对象的实例来执行此操作,如下所示:

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

答案 2 :(得分:3)

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

答案 3 :(得分:1)

您的代码中存在一些问题。

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

    BluMote.SettingsForm.send2display =“test”; //这是错误的

  2. 尝试从其他类访问SettingsForm类成员,例如访问静态成员。

  3. 首先,您必须将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");
    

答案 4 :(得分:0)

您可以更改以下代码并查看其是否有效:

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