Pavan Kumar
Pavan Kumar

Reputation: 9

How do i pass a variable value from Console application to windows form application in C# (visual studio)

I am doing a project in which i have to send the variable data from my console application project to windows form application( i have to write that data into textbox). I am trying to pass a variable val to my form and below code is what i tried to do but passed value(num variable in windows form) is zero instead of 1 (serial.Val in console application which is passed as argument and then i am calling the form).

Can anyone please help me with that ?

This is my windows forms code:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WindowsFormsApplication2;

namespace WindowsFormsApplication2
{
    public partial class Serial_comm_1 : Form
    {
        //private static int temp;
        private DateTime Datetime;
        string indata;
        static SerialPort COMport;
       // private static int num;


        public Serial_comm_1(int num)
        {
            InitializeComponent();
            string Port_Name = "COM3";    // Store the selected COM port name to "Port_Name" varaiable
            int Baud_Rate = 9600; // Convert the string "9600" to int32 9600
            COMport = new SerialPort(Port_Name, Baud_Rate);
            COMport.Parity = Parity.None;
            COMport.StopBits = StopBits.One;
            COMport.DataBits = 8;
            COMport.Handshake = Handshake.None;
            COMport.RtsEnable = true;
            COMport.DtrEnable = true;
            TextBox_Transmit_Data.Text = num.ToString();

            //try to open the port 
            #region  
            try
            {
                COMport.Open();
                textBox_System_Log.Text = "";
            }

            catch (UnauthorizedAccessException SerialException) //exception that is thrown when the operating system denies access 
            {
                MessageBox.Show(SerialException.ToString());
                textBox_System_Log.Text = Port_Name + Environment.NewLine + Baud_Rate;
                textBox_System_Log.Text = textBox_System_Log.Text + Environment.NewLine + SerialException.ToString();
                COMport.Close();
            }

            catch (System.IO.IOException SerialException)     // An attempt to set the state of the underlying port failed
            {
                MessageBox.Show(SerialException.ToString());
                textBox_System_Log.Text = Port_Name + Environment.NewLine + Baud_Rate;
                textBox_System_Log.Text = textBox_System_Log.Text + Environment.NewLine + SerialException.ToString();
                COMport.Close();
            }

            catch (InvalidOperationException SerialException) // The specified port on the current instance of the SerialPort is already open
            {
                MessageBox.Show(SerialException.ToString());
                textBox_System_Log.Text = Port_Name + Environment.NewLine + Baud_Rate;
                textBox_System_Log.Text = textBox_System_Log.Text + Environment.NewLine + SerialException.ToString();
                COMport.Close();
            }

            catch //Any other ERROR
            {
                MessageBox.Show("ERROR in Opening Serial PORT -- UnKnown ERROR");
                COMport.Close();
            }
            #endregion
        }

        private void Button_Transmit_Data_Click(object sender, EventArgs e)
        {
              //Local Variables
           string Port_Name = "COM3";    // Store the selected COM port name to "Port_Name" variable
            int Baud_Rate = 9600; // Convert the string "9600" to int32 9600
            string Data = TextBox_Transmit_Data.Text;                             //Store the string in Textbox to variable "Data"          
            COMport.ReadTimeout = 3500; //Setting ReadTimeout =3500 ms or 3.5 seconds
            Console.WriteLine(COMport.IsOpen);
            COMport.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
            //Program1 prog = new Program1();

            //If we are able to open the port 
            if (COMport.IsOpen == true)
            {
                COMport.WriteLine(Data);                // Send Data

                textBox_System_Log.Text = Port_Name + Environment.NewLine + Baud_Rate;
                textBox_System_Log.Text = textBox_System_Log.Text + Environment.NewLine + Data + "  Written to Port" + Environment.NewLine;
            }
            else
            {
                TextBox_Received_Data.Enabled = true; // Enable the Receive Groupbox
                MessageBox.Show("Unable to Write to COM port ");
                COMport.Close();
            }
        }

        private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {
               SerialPort sp = (SerialPort)sender;

                indata = sp.ReadLine();
                this.Invoke(new EventHandler(display_data_event));
        }

        private void display_data_event(object sender, EventArgs e)
        {
            Datetime = DateTime.Now;
            String time = Datetime.Hour + ":" + Datetime.Minute + ":" + Datetime.Second;
            textBox_System_Log.AppendText(time + "\t\t\t" + indata + Environment.NewLine);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
        }

        private void label1_Click(object sender, EventArgs e)
        {
        }

        private void textBox_Received_Data_TextChanged(object sender, EventArgs e)
        {
        }

        private void TextBox_Transmit_Data_TextChanged(object sender, EventArgs e)
        {
        }
    }
}

This is my trail of console application:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WindowsFormsApplication2;
using System.Windows.Forms;


namespace ConsoleApplication1
{
    class Program1
    {
        private int val;
        public int Val
        {
            get { return val; }
            set { val = value; }
        }

        static void Main(string[] args)
        {
            Program1 serial = new Program1();
            serial.Val = 1;

            System.Windows.Forms.Application.Run(new Serial_comm_1(serial.Val));

            //Serial_comm_1 serial_form1 = new Serial_comm_1(serial.Val);
        }
    }
}

Upvotes: 1

Views: 1641

Answers (1)

user12228709
user12228709

Reputation:

From your app you want to start the other app:

// Create a new Process
System.Diagnostics.Process process = new System.Diagnostics.Process();

process.StartInfo = new System.Diagnostics.ProcessStartInfo();
process.StartInfo.FileName = @"C:\Projects\Temp912\bin\Debug\Temp912.exe";
process.StartInfo.Arguments = "Test Argument";
process.StartInfo.UseShellExecute = false;
process.Start();

Now from your Windows Form App, modify the Main method:

using System;
using System.Windows.Forms;

namespace Temp912
{
    static class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            string arg1 = "";

            if ((args != null) && (args.Length > 0))
            {
                arg1 = args[0];

                MessageBox.Show("Arg1: " + arg1, "Arg App Started With Parameter");
            }
            else
            {
                MessageBox.Show("Arg1: N/A", "Arg App Started Without Parameter");
            }

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

If you need to pass the parameter value(s) to your Main Form, expose a property or properties on your form, and set the value(s) before you launch the form.

Edit Per Question:

Form Code

public string MyProperty { get; set; } // change the data type to int or whatever

Than in Program.cs, instead of:

Application.Run(new Form1());

Do this:

// create an instance of your form
Form1 form1 = new Form1();

// set the property or properties
form1.MyProperty = arg1;

Then call:

// this is should work, I didn't test this like the other code
Application.Run(form1);

Upvotes: 1

Related Questions