我有一个UI类和一个Class,表示我需要填充UI类DGV的调用。当我在worker类中调用Bindinglist.Clear()
时,我得到了DGV的跨线程操作异常。我查看了.Invoke
的建议,但由于工人类中出现错误,我不明白我把它放在哪里。
继承工人阶级。 DisplayArray
是一个静态绑定列表:
private void Get_ByHarvestDate(DateTime HarvestDate)
{
try
{
Lots Ls = new Lots();
DataTable _plantLots = DataHelper.ExecuteProc("[Abattoir].[Lots_Select_ByHarvestDate]",
new ProcParams("HarvestDate", HarvestDate), DataBaseMaster.PlantConnectionString);
if (_plantLots.Rows.Count > 0)
DisplayArray.Clear();//<---error here
foreach (DataRow Row in _plantLots.Rows)
{
Lot L = FillLots(Row);
// if (!Ls.ContainsKey(L.Lot_No))
Ls.Add(L.Lot_No, L);
}
foreach (DataRow Row in _plantLots.Rows)
{
LotCacheItem _lc = new LotCacheItem();
_lc.Lot_No = Row.Field<short>("Lot_No");
_lc.HeadCount = Row.Field<int>("HeadCount");
_lc.ProducerName = Row.Field<string>("Producername");
_lc.BloodPittedCount = GetBloodPittedCount(_lc.Lot_No);
DisplayArray.Add(_lc);
}
LotsDictionary?.Clear();
LotsDictionary = Ls;
}
catch (Exception _e)
{
MessageWindow.Show("", _e.Message);
}
}
_plantLots
只是来自查询的数据表,所以当它有行时,我想清除列表并重新填充。
以下是UI类ListChanged
处理程序:
private void HandleGridUpdate(object sender, EventArgs e)
{
try
{
DgvLots.AutoGenerateColumns = false;
DgvLots.DataSource = null;
DgvLots.DataSource = LotCache.DisplayArray;
lotDisplay_Current.UpdateLot(_currentLot);
SelectGridRow(_currentLot.Lot_No);
}
catch (Exception _e)
{
MessageWindow.Show("", _e.Message);
}
}
我不明白为什么我会收到此错误(我认为这是在ListUpdated
回调中),这使得修复很难。