mikybrain1 Ответов: 1

использование async / await для заполнения DGV


Привет У меня есть небольшие проблемы с запуском моего datagridview с помощью метода async / await.

Событие нажатия кнопки:
private async void button2_Click(object sender, EventArgs e)
        {
            datagridview1.Visible = true;
            //Progressbar  
            Progressbar1  .Visible = true;
            Progressbar1  .Style = ProgressBarStyle.Marquee;
            var period2 = cb1.SelectedValue.ToString();
            var period1 = cb2.SelectedValue.ToString();
           

            /*A variable to hold the parameters*/
            //var table = await loadTable((period1, period2));

            await Task.Run(() => loadTable(period1, period2));

             /*back to the UI */
            //datagridview1.DataSource = datatable;
            
            //datagridview1.DataSource = table;

            Progressbar1  .Visible = false;
        }


Я попытался получить DGV с помощью using the two / / datagridview.Линия источника данных безуспешно.

Метод моей задачи:

 private async Task Zugänge(string period1, string period2) 

{

    //
    string C = ConfigurationManager.ConnectionStrings["123"].ConnectionString;
    using (var con = new SqlConnection(C))
    using (var cmd = new SqlCommand())
    {
        cmd.Connection = con;
        cmd.CommandText = ("[dbo].[spInfo]");
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@Periode2", period2);
        cmd.Parameters.AddWithValue("@Periode1", period1);
        // open the connection
        con.Open();
        SqlDataAdapter adapter = new SqlDataAdapter(cmd);
        DataTable datatable = new DataTable();
        adapter.Fill(datatable );
       
        await Task.Run(() => adapter.Fill(datatable ));
        
    }
}

Afzaal Ahmad Zeeshan

Что такое отчет о неудаче? Можете ли вы поделиться, почему вы считаете, что этот код не работает?

Также помните, что операторы async/await просто позволяют вам использовать модель асинхронного программирования в вашем приложении. В противном случае они бесполезны для работы с графикой.

mikybrain1

Хорошо. Если я использую строку var table = await loadTable ((period1, period2)); и устанавливаю ее в DGV, то подчеркиваю таблицу, говоря, что "void" не может неявно типизированные локальные переменные выделяться.

И если я использую эту строку: datagridview1.DataSource = datatable; она утверждает, что база данных имен не существует в текущем контексте.

Afzaal Ahmad Zeeshan

В нем будет указано, datatable не существует в текущем контексте, нет идентификатора database используется здесь.

Кроме того, void не может быть сохранен в значение переменной. loadTable может быть возвращена пустота (подпись может быть, private async void loadTable), при этом он вам этого не позволяет.

mikybrain1

Просто в CHill60, которые заставляют меня думать дальше, даже когда я#м несомненно, разочарован.

1 Ответов

Рейтинг:
9

mikybrain1

Я добавил возврат к концу моего метода задачи:

private async Task Zugänge(string period1, string period2) 
 
{
 
    //
    string C = ConfigurationManager.ConnectionStrings["123"].ConnectionString;
    using (var con = new SqlConnection(C))
    using (var cmd = new SqlCommand())
    {
        cmd.Connection = con;
        cmd.CommandText = ("[dbo].[spInfo]");
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@Periode2", period2);
        cmd.Parameters.AddWithValue("@Periode1", period1);
        // open the connection
 // Here open the connection async:
        await con.OpenAsync();
        SqlDataAdapter adapter = new SqlDataAdapter(cmd);
        DataTable datatable = new DataTable();
        adapter.Fill(datatable );
       
        await Task.Run(() => adapter.Fill(datatable ));
return dt;
        
    }
}


George Swan

Вы уверены, что это правильное решение? Вы вызываете один и тот же адаптер.Способ заполнить дважды за последние 3 строки кода.