Я заполняю 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!");
}