Форма без движения при заполнении DataGridView - PullRequest
1 голос
/ 12 июля 2020

Я использую DataGridView в качестве консоли для приложения, мне нужно заполнять его каждую секунду, для этого я использую следующий код:

public class dgView
{
    public static DataGridView DataConsole;

    public static void addLinha(int tipo_acao, string acao, string extra, int tipo_extra)
    {
        // INSERE LINHA NO CONSOLE
        try
        {
            if (DataConsole == null) return;

            var idLinha = DataConsole.Rows.Add();
            using (var linha = DataConsole.Rows[idLinha])
            {
                //await Task.Delay(300);

                if (tipo_acao == 0)
                {
                    linha.DefaultCellStyle.ForeColor = Color.Teal;
                    linha.Cells[3].Style.ForeColor = Color.Gray;
                }
                else if (tipo_acao == 1)
                {
                    linha.DefaultCellStyle.ForeColor = Color.Yellow;
                    linha.Cells[3].Style.ForeColor = Color.Orange;
                }
                else
                {
                    linha.DefaultCellStyle.ForeColor = Color.Red;
                    linha.Cells[3].Style.ForeColor = Color.Magenta;
                }


                linha.Cells["dg_data"].Value = DateTime.Now;
                linha.Cells["dg_mapa"].Value = "" + Config.Mapa + "";
                linha.Cells["dg_acao"].Value = "" + Config.rm.GetString("" + acao + "") + "";
                if (tipo_extra == 0)
                {
                    linha.Cells["dg_extra"].Value = "" + extra + "";
                }
                else
                {
                    linha.Cells["dg_extra"].Value = "" + Config.rm.GetString(extra) + "";
                }

                DataConsole.CurrentCell = DataConsole.Rows[idLinha].Cells[0];
                //DataConsole.Refresh();

            }
        }
        catch (Exception ex)
        {
            throw;
        }
    }
}

Однако форма зависает, и я не могу переместите его в любую часть экрана, есть ли способ решить эту проблему? Помня, что DataGridView не заполняется и не может быть заполнен с помощью свойства DataSource, а путем постоянной проверки в системе.

Пример:

public static void Abrir(string metodoChamador)
{
    try
    {
       Abrir:
        dgView.addLinha(2, "config_Abrir", "config_Validando", 1);
        Thread.Sleep(5000);
        Atalho:
        string AtalhoExiste = "" + Directory.GetCurrentDirectory() + "\\" + Config.Atalho + ".lnk";
        if (!File.Exists(AtalhoExiste))
        {
            dgView.addLinha(2, "config_FaltaIcone", "", 0);
            Thread.Sleep(5000);
            goto Atalho;
        }
        else
        {

            ProcessStartInfo info = new ProcessStartInfo(@"" + Directory.GetCurrentDirectory() + "\\" + Config.Atalho + ".lnk");
            Process whatever = Process.Start(info);
            whatever.Dispose();
            Thread.Sleep(5000);
            IntPtr WinHandle = Win32.FindWindow(null, Config.Atalho);
            
            if (WinHandle == (IntPtr)0)
            {
                goto Abrir;
            }
 
        }
    }
    catch (Exception ex)
    {
        throw;
    }
}

1 Ответ

2 голосов
/ 12 июля 2020

Трудно сказать, есть ли у вас другие потенциальные проблемы в коде. Практически везде, где у вас есть Thread.Sleep(), ваш GUI будет зависать.

Вот возможный рефакторинг вашего метода Abrir(), используя async\await и Task.Delay(), как это предлагает JQSOFT:

public async static void Abrir(string metodoChamador)
{
    try
    {
        IntPtr WinHandle = IntPtr.Zero;
        do
        {
            dgView.addLinha(2, "config_Abrir", "config_Validando", 1);
            await Task.Delay(5000);

            string AtalhoExiste = "" + Directory.GetCurrentDirectory() + "\\" + Config.Atalho + ".lnk";
            while (!File.Exists(AtalhoExiste))
            {
                dgView.addLinha(2, "config_FaltaIcone", "", 0);
                await Task.Delay(5000);
            }

            ProcessStartInfo info = new ProcessStartInfo(@"" + Directory.GetCurrentDirectory() + "\\" + Config.Atalho + ".lnk");
            Process whatever = Process.Start(info);
            whatever.Dispose();
            await Task.Delay(5000);

            WinHandle = Win32.FindWindow(null, Config.Atalho);
        }
        while (WinHandle.Equals(IntPtr.Zero));
    }
    catch (Exception ex)
    {
        throw;
    }
}

Если у вас есть Thread.Sleep() в других местах, их нужно будет отредактировать. Если у вас есть какие-либо другие бесконечные циклы, использующие goto, их, возможно, также придется отредактировать.

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