在c#中动态创建同一类的多个对象实例

时间:2017-06-02 08:54:31

标签: c# winforms visual-studio serial-port

我正在用C#构建一个控制泵流量的设备控制器。 Form1和Pump-Class,保存泵的所有属性和方法,可通过表格访问。到目前为止,一切正常。但是,可能存在多个泵的情况。当然,我可以运行可执行文件的各个实例,但你知道..

如何根据我当前的需求创建泵级的多个实例。也许是一个带有Add-Button的额外表格,可以根据需要创建尽可能多的泵?

当然,这归结为一个非常基本的问题,但我不是专业程序员..任何评论都非常感谢。

提前致谢。

mulm

namespace PumpController
{

    public partial class Form1 : Form
    {

        static Pump pump;

        public Form1()
        {

            InitializeComponent();

            cb_availablePorts.DropDownStyle = ComboBoxStyle.DropDownList;
            cb_baudRates.DropDownStyle = ComboBoxStyle.DropDownList;

            string[] availablePorts = SerialPort.GetPortNames();
            foreach (string item in availablePorts)
                {
                    cb_availablePorts.Items.Add(item);
                }

            string[] commonBaudRates = new string[] { "4800", "9600", "19200", "38400", "57600", "115200" };
            foreach (string item in commonBaudRates)
            {
                cb_baudRates.Items.Add(item);
            }
        }

        private void bt_valueUp_Click(object sender, EventArgs e)
        {
            if (!(pump == null))
            {
                pump.increaseValue();
            }           
        }

        private void bt_valueDown_Click(object sender, EventArgs e)
        {
            if (!(pump == null))
            {
                pump.decreaseValue();
            }
        }

        private void Form_Closing(object sender, EventArgs e)
        {
            Hide();
            if (!(pump == null))
            {
                pump.Close();
            }                
        }

        private void bt_connect_Click(object sender, EventArgs e)
        {
            if (!(cb_availablePorts.SelectedItem == null) && !(cb_baudRates.SelectedItem == null))
            {
                Pump pump = new Pump(Convert.ToString(cb_availablePorts.SelectedItem), Convert.ToInt32(cb_baudRates.SelectedItem));
            }           
        }
    }
}

1 个答案:

答案 0 :(得分:1)

评论引出了部分答案,并且就他们而言是正确的。然而,一个重要的事情可能被忽略了 - 关于寻找(其他)COM端口的部分。

每次实例化new Pump对象并将其添加到List<Pump>集合时,除非您分配另一个端口,否则这些对象将争用相同的COM端口。

enumerating COM ports有一个广为接受的答案。讨厌提供一个链接作为我的答案的核心,但如果你有一个Pump对象的四个对象列表竞争单个串口,你可能会遇到麻烦。