Datatable не отображает информацию после заполнения SQL-запроса в backgroundworker - PullRequest
0 голосов
/ 25 марта 2019

Я заполняю DataTable данными из запроса SQL. Поскольку это может быть довольно медленно, я выполняю запрос и выполняю некоторые вычисления на DataTable с использованием BackgroundWorker. Я знаю, что фоновый поток запущен, потому что в RunWorkerCompleted я установил MessageBox для отображения сообщения. Однако после завершения данные не отображаются в DataTable.

Я знаю, что этот код работает, потому что когда я запускаю прямо с нажатия кнопки и не использую BackgroundWorker, я вижу все ожидаемые данные в DataTable. Вероятно, проблема связана с тем, как обновляется пользовательский интерфейс и BackgroundWorker, так как я знаю, что вы не можете обновить пользовательский интерфейс напрямую из другого потока, но я, честно говоря, не знаю. Мой код ниже.

    DataTable tab1table = new DataTable();

    public Form1()
    {
        InitializeComponent();
        Instantiatesearch1Thread();
    }

    private void Instantiatesearch1Thread()
    {
        search1Thread.WorkerReportsProgress = true;
        search1Thread.WorkerSupportsCancellation = true;
        search1Thread.ProgressChanged += search1Thread_ProgressChanged;
        search1Thread.DoWork += search1Thread_Dowrk;
        search1Thread.RunWorkerCompleted += search1Thread_RunWorkerCompleted;
    }

        private void sbutton1_Click(object sender, EventArgs e)
    {
        search1Thread.RunWorkerAsync();
    }
    void search1Thread_Dowrk(object sender, DoWorkEventArgs e)
    {
        int percentprogress = 0;
        percentprogress++;
        Thread.Sleep(1000);
        // Search1 button event handler
        using (SqlConnection conn = new SqlConnection(connectionstring))
        {

            conn.Open();
            using (SqlDataAdapter cmd = new SqlDataAdapter(comboBox1SQL, conn))
            {
                if (comboBox1.Text.Contains("ID"))
                {
                    long para = long.Parse(search1.Text);
                    cmd.SelectCommand.Parameters.Add(new SqlParameter
                    {
                        ParameterName = "@combo1Par",
                        Value = para,
                        SqlDbType = SqlDbType.BigInt
                    });
                }

                else if (comboBox1.Text.Contains("Other Thing") || comboBox1.Text.Contains("Other Stuff"))
                {
                    string para = search1.Text;
                    cmd.SelectCommand.Parameters.Add(new SqlParameter
                    {
                        ParameterName = "@combo1Par",
                        Value = "%" + para + "%",
                        SqlDbType = SqlDbType.NVarChar,
                    });
                }
                // Clear datatable if it contains any information and then fill it
                // tab1datatable is a DataGridView
                if (tab1table != null)
                    tab1table.Clear();
                cmd.Fill(tab1table);
                tab1datatable.DataSource = tab1table;

            // A bunch of long calculations 
            }
        }
    }

    void search1Thread_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        search1Progress.Value = e.ProgressPercentage;
    }

    void search1Thread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        MessageBox.Show("All Done!");
    }

1 Ответ

2 голосов
/ 25 марта 2019

Для BackgroundWorker вы должны немного изменить свой процесс:

Вместо обновления DataSource из DataGridView в search1Thread_Dowrk из BackgroundWorker просто обновите DataTable в нем, а затем на search1Thread_RunWorkerCompleted вызовите процесс обновления источника данных.

Измените свой код с этого:

void search1Thread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
     MessageBox.Show("All Done!");
}

Кому:

void search1Thread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    tab1datatable.DataSource = tab1table;
    tab1datatable.Refresh(); 
    MessageBox.Show("All Done!");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...