我DataGridView通过运行 SQL 查询来填充BackgroundWorker. 如果我直接在按钮事件处理程序中运行代码,我的代码将完美运行,但是当我放入DoWorkBackgroundWorker 时,它不会更新 UI。我的代码如下。
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
});
}
通过使用 aMessageBox我发现代码没有访问if comboBox1.Text.Contains()语句,我认为这是有道理的,因为该信息来自 UI 并且BackgroundWorker不能直接访问 UI。这也可以解释为什么当时tab1datatable并tab1table没有受到影响。
我想我需要在Invoke某处使用该方法,但我不确定如何使用。我查看了c# - 在执行期间将信息从 UI 传递给 BackgroundWorker,但它并没有真正回答我的问题。如果Invoke是我需要的,我如何在此代码中实现以允许它从 UI 获取信息并随后用填充的更新它DataGridView?
慕尼黑5688855
慕妹3146593
相关分类