'Display a updating list of items on Windows Form using C#

I read a MAC addresses from serial monitor and then i need to put them in the list. My problem is that only the first incoming address (string) is stored in the list. I also need the same addresses (string) not to be stored in the list more than once. I use listbox to view the items in the list. Thanks.

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;
using System.IO.Ports;

 namespace SerialMonitor2
 {

public partial class Form1 : Form
{
    private SerialPort myport;
    private DateTime datetime;
    private string in_data;
    List<string> MacList = new List<string>();
    public int cnt = 0;
    public Form1()
    {
        InitializeComponent();
    }

    private void stop_btn_Click(object sender, EventArgs e)
    {
        try
        {
            myport.Close();
        }
        catch (Exception ex2)
        {
            MessageBox.Show(ex2.Message,"Error");
        }
    }

    private void start_btn_Click(object sender, EventArgs e)
    {

        myport = new SerialPort();
        myport.BaudRate = 115200;
        myport.PortName = port_name_tb.Text;
        myport.Parity = Parity.None;
        myport.DataBits = 8;
        myport.StopBits = StopBits.One;
        myport.DataReceived += myport_dataReceived;
        try
        {
            myport.Open();
            data_tb.Text = "";
        }
        catch (Exception ex2)
        {
            MessageBox.Show(ex2.Message, "Error");
        }
    }

    private void myport_dataReceived(object sender, SerialDataReceivedEventArgs e)
    {  
        in_data = myport.ReadLine();
        this.Invoke(new EventHandler(displaydata_event));
    }

    private void displaydata_event(object sender, EventArgs e)
    {
        datetime = DateTime.Now;
        string time = datetime.Hour + ":" + datetime.Minute + ":" + datetime.Second;          


        if (in_data[0] == '&')
        {
            
            string[] arr = in_data.Split('#');
            string MAC = arr[0];
            string temperature = arr[3];
            textBox1.Text = MAC;
            textBox2.Text = temperature;

            MacList.Add(MAC);
            listBox1.DataSource = MacList;

        }
        
        data_tb.AppendText(in_data + "\n");


    }

    private void port_name_tb_TextChanged(object sender, EventArgs e)
    {

    }
}
}


Solution 1:[1]

/// Try this

public partial class Form1 : Form
{
    private SerialPort myport;
    private DateTime datetime;
    private string in_data;
    List<string> MacList = new List<string>();
    public int cnt = 0;
    public Form1()
    {
        InitializeComponent();
    }

    private void stop_btn_Click(object sender, EventArgs e)
    {
        try
        {
            myport.Close();
        }
        catch (Exception ex2)
        {
            MessageBox.Show(ex2.Message,"Error");
        }
    }

    private void start_btn_Click(object sender, EventArgs e)
    {

        myport = new SerialPort();
        myport.BaudRate = 115200;
        myport.PortName = port_name_tb.Text;
        myport.Parity = Parity.None;
        myport.DataBits = 8;
        myport.StopBits = StopBits.One;
        myport.DataReceived += myport_dataReceived;
        try
        {
            myport.Open();
            data_tb.Text = "";
            
            string[] arr = in_data.Split('#');
            string MAC = arr[0];
            if !MacList.Contains(MAC))
                MacList.Add(MAC);
        }
        catch (Exception ex2)
        {
            MessageBox.Show(ex2.Message, "Error");
        }
    }

    private void myport_dataReceived(object sender, SerialDataReceivedEventArgs e)
    {  
        in_data = myport.ReadLine();
        this.Invoke(new EventHandler(displaydata_event));
    }

    private void displaydata_event(object sender, EventArgs e)
    {
        datetime = DateTime.Now;
        string time = datetime.Hour + ":" + datetime.Minute + ":" + datetime.Second;          
        if (in_data[0] == '&')
        {            
            string[] arr = in_data.Split('#');
            string MAC = arr[0];
            string temperature = arr[3];
            textBox1.Text = MAC;
            textBox2.Text = temperature;
            // MacList.Add(MAC);
            listBox1.DataSource = MacList;

        }        
        data_tb.AppendText(in_data + "\n");
    }
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Carlos