Добавление данных, прочитанных из сокета, в DataGridView (в c#) - PullRequest
0 голосов
/ 29 февраля 2020

Я создал слушатель сокета, используя C#. Я хочу перечислить данные, прочитанные на этом сокете, мгновенно в DataGridWiew. (около 100 данных в секунду передается через этот сокет) Я успешно прочитал данные в сокете, но при попытке мгновенно отобразить их в DataGridView экран зависает до тех пор, пока поток данных не прекратится. Когда поток данных останавливается, все данные отображаются в DataGridView. Но вместо этого я хочу, чтобы DataGridView успешно обновлялся непрерывно при добавлении данных.

Существует ли способ мгновенного отображения такого большого количества данных в DataGridView?

Где я делаю ошибки?

Код:

        frm.loggGridView.ColumnCount = 5;
        frm.loggGridView.ColumnHeadersVisible = true;
        DataGridViewCellStyle columnHeaderStyle = new DataGridViewCellStyle();
        columnHeaderStyle.BackColor = Color.Beige;
        columnHeaderStyle.Font = new Font("Verdana", 10, FontStyle.Bold);
        frm.loggGridView.ColumnHeadersDefaultCellStyle = columnHeaderStyle;

        frm.loggGridView.Columns[0].Name = "ID";
        frm.loggGridView.Columns[1].Name = "LATITUDE";
        frm.loggGridView.Columns[2].Name = "LONGITUDE";
        frm.loggGridView.Columns[3].Name = "ALTITUDE";
        frm.loggGridView.Columns[4].Name = "TIME";


        int i= 0;
        try
        {
            PointF p1;
            while (true)
            {

                byte[] bytes = listener.Receive(ref groupEP);
                String FlightData = Encoding.UTF8.GetString(bytes, 0, bytes.Length);

                //  Console.WriteLine("broadcast veri {0} :\n {1}\n", groupEP.ToString(), FlightData);

                String[] FlightDataSplit = FlightData.Split(' ', '\n');
                p1 = new PointF(FlightDataSplit[1], FlightDataSplit[0], FlightDataSplit[2]);

                frm.loggGridView.Rows.Add();

                frm.loggGridView.Rows[i].Cells[0].Value = i;

                frm.loggGridView.Rows[i].Cells[1].Value = p1.latitude;

                frm.loggGridView.Rows[i].Cells[2].Value = p1.longitude;

                frm.loggGridView.Rows[i].Cells[3].Value = p1.altitude;

                frm.loggGridView.Rows[i].Cells[4].Value = DateTime.Now;

               i++;


            }


        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }

1 Ответ

0 голосов
/ 29 февраля 2020

Я попытался создать быстрый пример LINQPad. Это продолжит добавлять новые результаты в фоновом режиме, без зависания приложения


// Simple GridView control
DataGridView gridView = new System.Windows.Forms.DataGridView();

gridView.Columns.Add("A", "A");
gridView.Columns.Add("B", "B");
gridView.Columns.Add("C", "C");

// Display the Control in LINQPad
PanelManager.DisplayControl(gridView);

await Task.Run(async () => 
{
    while(true)
    {
        // your listener code       
        var results = Enumerable.Range(0, 100).Select(x => x).ToList();

        if(gridView.IsHandleCreated)
        {
            // render on the UI thread
            gridView.Invoke((MethodInvoker)delegate
            {
                for (int i = 0; i < results.Count; i++)
                {
                    int index = gridView.Rows.Add();
                    gridView.Rows[index].Cells[0].Value = 1;
                    gridView.Rows[index].Cells[1].Value = 2;
                    gridView.Rows[index].Cells[2].Value = 3;
                }
            });
        }

        await Task.Delay(1000); // remove this from your solution, your listener is blocking
    }

});




Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...