在 c# winforms 应用程序中,我有带有两个日期开始日期和结束日期的 datagridview。我需要在日期范围内填充datagridview。填充数据网格视图需要花费大量时间,并且 Windows 窗体 exe 变得无响应。我现在正在使用后台工作者。当我在选择日期后单击搜索按钮时,它会填充 datagridview。我单击清除按钮清空 datagridview。当我再次选择日期并单击搜索按钮时,出现错误。
跨线程操作无效控制从创建它的线程以外的线程访问。
private clsStkBAL obj = new clsStkBAL();
public frmSalesStk()
{
InitializeComponent();
backgroundWorker1.WorkerReportsProgress = true;
}
private void FillGrid()
{
try
{
this.obj.SP_STATUS = nameof(FillGrid);//SP_SalesInvoice
this.obj.Sih_StartDate = new DateTime?(this.dtpFromdt.Value.Date);//set_Sih_StartDate
this.obj.Sih_EndDate = new DateTime?(this.dtpToDate.Value.Date);
clsCommon.BindeDataGridView(this.dgvStock, (object)this.obj.GetDataTable((clsSalesStock)this.obj, (SqlTransaction)null, false), false);
// ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
}
catch (Exception ex)
{
clsCommon.ShowErrorMessage(ex.Message);
}
}
private void btnSearch_Click(object sender, EventArgs e)
{
if(backgroundWorker1.IsBusy)
{
clear();
}
backgroundWorker1.RunWorkerAsync(2000);
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
if (btnSearch.InvokeRequired)
{
dgvStock.Invoke(new Action(FillGrid));
}
FillGrid();
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
if (backgroundWorker1.IsBusy)
{
Thread.Sleep(20000);
}
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("Loaded");
backgroundWorker1.Dispose();
dtpFromdt.Enabled = true;
dtpToDate.Enabled = true;
}
private void frmSalesStock_Load(object sender, EventArgs e)
{
dtpFromdt.Value = new DateTime(2021, 02, 01);
dtpToDate.Value = new DateTime(2021, 02, 01);
backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
}
public void clear()
{
dgvStock.DataSource = null;
backgroundWorker1.CancelAsync();
}
private void btnClear1_Click(object sender, EventArgs e)
{
clear();
}
}
how to fix this error.pls
如何解决这个错误。
这条线对我来说看起来很狡猾:
dgvStock.Invoke(new Action(FillGrid));
错误是因为你应该在主线程上处理 UI 的事情:
跨线程操作无效控制从创建它的线程以外的线程访问。
看来你在后台工作人员中调用一个动作并且有问题 - 在主线程之外执行它 - 这是我写的一个例子,你可以使用 CodeConverter 将它从 VB.Net 移植回 C#: