我想对我的Windows窗体应用程序的结构提出一些建议。我的应用程序将允许用户打开import { Connection } from 'tedious';
import { Request } from 'tedious';
var config = {
userName: 'dbuser',
password: 'dbpassword',
server: 'mydatabase.database.windows.net',
options: {
instanceName: 'SQLEXPRESS', // Removed this line while deploying it on server as it has no instance.
database: 'dbname'
}
};
connection = new Connection(config);
connection.on('connect', function(err) {
if (err) {
console.log('error : '+err);
} else {
console.log("Connected to Database");
}
});
以便从USB设备读取数据。
目前,应用程序将打开到主窗体,然后用户将打开另一个窗体SerialPort
以配置端口,然后将关闭此窗体并且用户将返回到主窗体。按照目前的情况,用户选择端口,单击打开,然后将端口信息传递到另一个端口配置类并进行设置。
然后我如何将此数据传回主表单?
这是实现这一目标的正确/最有效的方法吗?
端口配置表单
frmPortConfig
端口配置类:
public partial class frmPortConfig : Form
{
public frmPortConfig()
{
InitializeComponent();
//center the form
this.CenterToScreen();
//get serial ports
getPorts();
}
public void getPorts()
{
//stop user from editing the combo box text
cmbPortList.DropDownStyle = ComboBoxStyle.DropDownList;
//get the available ports
string[] ports = SerialPort.GetPortNames();
//add the array of ports to the combo box within the
cmbPortList.Items.AddRange(ports);
}
private void btnOpenPort_Click(object sender, EventArgs e)
{
//get name of port
string port = cmbPortList.SelectedItem.ToString();
//if the port string is not null
if (port != null)
{
//if port can be opened (evoke open port code in port class)
if (clsPortConfig.openPort(port))
{
//inform user that port has been opened
lblPortStatus.Text = port + " opened successfully";
}
else
{
//inform user that port could not be opened
lblPortStatus.Text = port + " could not be opened";
}
}
}
private void btnClose_Click(object sender, EventArgs e)
{
//close the form
this.Close();
}
我应该如何将收到的数据发回我的主表单?
由于
答案 0 :(得分:1)
然后我如何将这些数据传回主表单?
由于您通过事件从设备异步捕获数据。你不知道它什么时候到来。所以你需要一个可以从clsPortConfig
开始的事件。
class clsPortConfig
{
public delegate void EventHandler(string s);
public static event EventHandler TransmitEvent;
// all the other stuff
public static void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
//set sender up as serial port
SerialPort serialPort = (SerialPort)sender;
//get data from serial port
string data = serialPort.ReadExisting();
if (TransmitEvent != null)
{
TransmitEvent(data);
}
}
}
并以以下形式注册:
public frmPortConfig()
{
InitializeComponent();
//center the form
this.CenterToScreen();
//get serial ports
getPorts();
clsPortConfig.TransmitEvent += MyTransmitEvent;
}
private void MyTransmitEvent(string s)
{
// in s you will find the data
}
这是实现这一目标的正确/最有效的方法吗?
我会怀疑。有很多方法可以做到这一点。你选择了一个相当复杂的人。最简单的可能是在Form
课程中拥有所有内容。如果要显示收到的数据,请在SerialPort
处注册DataReceived
事件并使用BeginInvoke方法访问TextBox
等显示控件。因为它将到达不同的线程,然后在。中创建控件。