none
窗口间控件的相互操作 RRS feed

  • 问题

  • (窗口2有一个串口控件)“”控制按钮“”第一次按下,打开窗口2,在发送区写入相关内容,第二次按下按钮,就发送去的内容(通过串口)送到第一个窗口的接收区。自己写的没有错误提示,但是运行也不成功。

    form1-----------------------------------------------

    using oprate_serialport; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace oprate_serialport { public partial class Form1 : Form { public delegate void newdeleeventhandle(object sender, EventArgs e); public event newdeleeventhandle newevent; public Form1() { InitializeComponent(); // newevent += newform2.uartset; // newevent += newform2.onuart; } public void onnewevent(object sender, EventArgs e) { if (newevent != null) newevent(this, e); } int num = 0; private void sport_oprate_Click(object sender, EventArgs e) { Form2 newform2 = new Form2(); num++; if (num == 1) { newform2.Show(); } else { if (num==2) { newform2.onuart (0,null);//不传输内容 num = 1; } } } } }

    form2---------------------------------------

    using System;
    using System.Windows.Forms;
    using System.IO.Ports;

    namespace oprate_serialport
    {
        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
                 
            }

            private void Form2_Load(object sender, EventArgs e)
            {
                first_port.PortName = "COM1";
                first_port.BaudRate = 9600;
                first_port.DataBits = 8;
                first_port.StopBits = StopBits.One;
                first_port.Parity = Parity.None;
            }

            public void onuart(object sender, EventArgs e )
            {
                Form1 newform1 = new Form1();  
                first_port.Open();
                first_port.WriteLine(senddata.Text);
                string  data2 =(first_port.ReadLine( ));
                newform1.receivedata.Text =(data2);
                first_port.Close();
            }

           
        }
    }


    2016年9月23日 10:12

答案

  • 1  窗体部分操作错误,这样写每次都是new一个Form2

    private void sport_oprate_Click(object sender, EventArgs e)
           
    {
               
    Form2 newform2 = new Form2();

    应该是

      Form2 newform2 ;

     private void sport_oprate_Click(object sender, EventArgs e)
           
    {
                if(
    newform2 ==null||newform2.IsDisposed)

                   newform2 =  new Form2();


    2  form2传回form1部分也写错了

    public void onuart(object sender, EventArgs e )
            {
                Form1 newform1 = new Form1();  

    这样写,总是创建一个新的form1,而不是正在打开的form1。

    可以将form1公开一个变量,

    public string Test

    {

      get { return receivedata.Text ;}

      set { receivedata.Text =value;}

    }

     这样,要创建form2时,将当前form1传进去即可

     newform2 =  new Form2(); 这一句改成  newform2 =  new Form2(this);

    则相应的form2的构造方法要修改下 

    Form1 newform1;
    public Form2(Form form1)
            {
                InitializeComponent();
                 this.newform1=form1;
            }

    最后修改这里的

     public void onuart(object sender, EventArgs e )
            {
               // Form1 newform1 = new Form1();  
                first_port.Open();
                first_port.WriteLine(senddata.Text);
                string  data2 =(first_port.ReadLine( ));
                newform1.Test=(data2);
                first_port.Close();
            }


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    • 已标记为答案 malei1988 2016年9月23日 10:46
    2016年9月23日 10:29

全部回复

  • 一些问题要问你:

    1)你Form2的按钮呢?发送按钮?

    2)为什么Form2中还要产生一个新的Form1?这样你每次都产生一个新的Form1,每次都不是同一个Form1。

    3)另外你的串口我没有涉及做过,不清楚原理;但是我想知道的是:如果你想Form1和Form2交互,应该在创建一个Form2的时候,把Form1传入。或者Form2公开监听事件,让Form1监听啊。


    ASP.NET Forum
    StackOverFlow
    FreeRice Donate
    Issues to report
    Free Tech Books Search and Download

    2016年9月23日 10:21
    版主
  • 1  窗体部分操作错误,这样写每次都是new一个Form2

    private void sport_oprate_Click(object sender, EventArgs e)
           
    {
               
    Form2 newform2 = new Form2();

    应该是

      Form2 newform2 ;

     private void sport_oprate_Click(object sender, EventArgs e)
           
    {
                if(
    newform2 ==null||newform2.IsDisposed)

                   newform2 =  new Form2();


    2  form2传回form1部分也写错了

    public void onuart(object sender, EventArgs e )
            {
                Form1 newform1 = new Form1();  

    这样写,总是创建一个新的form1,而不是正在打开的form1。

    可以将form1公开一个变量,

    public string Test

    {

      get { return receivedata.Text ;}

      set { receivedata.Text =value;}

    }

     这样,要创建form2时,将当前form1传进去即可

     newform2 =  new Form2(); 这一句改成  newform2 =  new Form2(this);

    则相应的form2的构造方法要修改下 

    Form1 newform1;
    public Form2(Form form1)
            {
                InitializeComponent();
                 this.newform1=form1;
            }

    最后修改这里的

     public void onuart(object sender, EventArgs e )
            {
               // Form1 newform1 = new Form1();  
                first_port.Open();
                first_port.WriteLine(senddata.Text);
                string  data2 =(first_port.ReadLine( ));
                newform1.Test=(data2);
                first_port.Close();
            }


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    • 已标记为答案 malei1988 2016年9月23日 10:46
    2016年9月23日 10:29
  • 1:发送按钮在form1中。

    2:form2中要使用form1中的textbox.text(也就是接收区),所以 new了一下。

    3: 就是委托和事件吗,具体不知道如何下手。

    4:感谢您的回答。

    2016年9月23日 10:45
  • 非常感谢您的回答。
    2016年9月23日 10:46