Как исправить при попытке добавить значения данных в список из другой формы - PullRequest
0 голосов
/ 21 января 2019

У меня проблема при попытке добавить данные в список из моей основной формы, я пытаюсь добавить данные в этот список из нового класса в моем проекте, мне нужен этот новый класс, чтобы иметь возможность добавлять данные вмой список без ошибок, я пытаюсь использовать invoke и получаю следующую ошибку (System.InvalidOperationException: «Invoke или BeginInvoke не могут быть вызваны для элемента управления, пока не создан дескриптор окна».) Я видел эту ошибку вдругие вопросы по переполнению стека, но похожие на мою проблему, я буду добавлять оба класса своего кода здесь, один - основной класс, а другой - второй класс, который я создал, который должен будет добавить данные в список.данные поступают из telnet tcp / ip и порта 23, что соединение работает нормально, проблема заключается в добавлении этих данных в мой список.

Основной класс вызывает функции из моего другого класса

namespace BarcodeReceivingApp {

//TelnetConnection stopConnection = new TelnetConnection();
public partial class BarcodeReceivingForm : Form
{
    //GLOBAL VARIABLES
    const string Hostname = "myip";
    private const int Port = 23;


    public BarcodeReceivingForm()
    {
        InitializeComponent();
    }

    private void btn_ConnectT_Click(object sender, EventArgs e)
    {

        var readData = new TelnetConnection(Hostname, Port);
        readData.ServerSocket(Hostname, Port);

    }

    private void btn_StopConnection_Click(object sender, EventArgs e)
    {
        //var connection = new TelnetConnection(Hostname, Port);
       // connection.CloseConnection();
    }
}

}

класс, который изменит данные моего списка из основного класса.

 namespace BarcodeReceivingApp

{открытый класс TelnetConnection {public BarcodeReceivingForm BcForm= new BarcodeReceivingForm ();

    private Thread _readWriteThread;
    private TcpClient _client;
    private NetworkStream _networkStream;
    private string _hostname;
    private int _port;

    public TelnetConnection(string hostname, int port)
    {
        this._hostname = hostname;
        this._port = port;
    }

    public void ServerSocket(string ip, int port)
    {

        try
        {
            _client = new TcpClient(ip, port);         
        }
        catch (SocketException)
        {
            MessageBox.Show(@"Failed to connect to server");
            return;
        }

        //Assign networkstream
        _networkStream = _client.GetStream();

        //start socket read/write thread
        _readWriteThread = new Thread(ReadWrite);
        _readWriteThread.Start();
    }

    public void ReadWrite()
    {

        //Set up connection loop
        while (true)
        {
            var command = "test";
            if (command == "STOP1")
                break;

            //write(command);
             var received = Read();


            BcForm.lst_BarcodeScan.Invoke(new Action (() => BcForm.lst_BarcodeScan.Items.Add(received)));


        }

    }

    public string Read()
    {
        byte[] data = new byte[1024];
        var received = "";

        var size = _networkStream.Read(data, 0, data.Length);
        received = Encoding.ASCII.GetString(data, 0, size);

        return received;
    }

    public void CloseConnection()
    {
        _networkStream.Close();
        _client.Close();
    }
}
}

окончательный результат, как я уже сказал, - это мой метод ReadWrite, при запуске цикла я добавлю данные в мой список из моего основного класса формы

здесь изображениегде я получаю ошибку Изображение ошибки

1 Ответ

0 голосов
/ 21 января 2019

Напиши свой второй класс, как это

using System;
using System.Threading;
using System.Windows.Forms; 
namespace BarcodeReceivingApp { 
    public class TelnetConnection { 

        private Thread _readWriteThread;
        private TcpClient _client;
        private NetworkStream _networkStream;
        private string _hostname;
        private int _port;
        private Form foo;

        public TelnetConnection(string hostname, int port)
        {
            this._hostname = hostname;
            this._port = port;
        }

        public void ServerSocket(string ip, int port,Form f)
        {
            this.foo = f;
            try
            {
                _client = new TcpClient(ip, port);         
            }
            catch (SocketException)
            {
                MessageBox.Show(@"Failed to connect to server");
                return;
            }

            _networkStream = _client.GetStream();

            _readWriteThread = new Thread(ReadWrite());
            _readWriteThread.Start();
        }  

        public void ReadWrite()
        {
            while (true)
            {
                var command = "test";
                if (command == "STOP1")
                    break;

                //write(command);
                 var received = Read();
                 if (foo.lst_BarcodeScan.InvokeRequired)
                 {
                         foo.lst_BarcodeScan.Invoke(new MethodInvoker(delegate {foo.lst_BarcodeScan.Items.Add(received);}));
                 }
            }
        }

        public string Read()
        {
            byte[] data = new byte[1024];
            var received = "";

            var size = _networkStream.Read(data, 0, data.Length);
            received = Encoding.ASCII.GetString(data, 0, size);

            return received;
        }

        public void CloseConnection()
        {
            _networkStream.Close();
            _client.Close();
        }
    }
}

Тогда используйте это так из своего основного класса:

private void btn_ConnectT_Click(object sender, EventArgs e)
{

    var readData = new TelnetConnection(Hostname, Port);
    readData.ServerSocket(Hostname, Port, this);

}
...