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
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);
您的代码中几乎没有问题。
-
调用类似于属性的方法。
BluMote.SettingsForm.send2display="测试";//这是错误的
-
尝试从另一个类访问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();
}