【发布时间】:2011-06-22 02:28:41
【问题描述】:
我正在开发一个 winform(mdi) 专业版。当我从另一个线程获取新数据时,我需要更新 dataGridView 控件。当新数据出现并且我正在拖动 dataGridview 滚动时,它会在 dataGridView.Invoke 中引发空引用异常。我已经搜索了几天,让谷歌发疯,但没有帮助。 代码如下:
public void ReceiveNewData(object sender, UpateEventArgs ex)
{
if (this.dataGridView.InvokeRequired)
{
dataGridView.Invoke(new UpateEventHandler(ReceiveNewData), new object[] { this, ex });
}
else
this.BindNewData();
}
private void BindNewData()
{
if (dataGridView!= null && (QuoteMember.listOneClickQuoteItem != null || QuoteMember.listMarketingQuoteItem != null))
{
DataTable dataSource = PublicFunction.ToDataTable(QuoteMember.listOneClickQuoteItem);
if (dataSource != null)
dataSource.Merge(PublicFunction.ToDataTable(QuoteMember.listMarketingQuoteItem), true);
else
dataSource = PublicFunction.ToDataTable(QuoteMember.listMarketingQuoteItem);
dataGridView.DataSource = dataSource;
}
}
public PublicFunction
{
public static DataTable ToDataTable(List dataSource)
{
if(dataSource != null)
return ToDataTable((dataSource.ToArray()), 1);
return null;
}
public static DataTable ToDataTable(List dataSource)
{
if (dataSource != null)
return ToDataTable((dataSource.ToArray()), 2);
return null;
}
private static DataTable ToDataTable(QuoteItemBase[] m, int type)
{
DataTable dsTemp = null;
if (type == 1)
{
dsTemp = new DataTable("OneClickQuote");
}
else if (type == 2)
{
dsTemp = new DataTable("MarketingQuote");
}
else
dsTemp = new DataTable("temptable");
dsTemp.Columns.Add("Date");
dsTemp.Columns.Add("Time");
dsTemp.Columns.Add("NO");
dsTemp.Columns.Add("Name");
if (m == null)
return dsTemp;
foreach (var item in m)
{
DataRow drTemp = dsTemp.NewRow();
drTemp["Date"] = item.date;
drTemp["Time"] = item.time;
drTemp["NO"] = item.no;
drTemp["Name"] = item.name;
dsTemp.Rows.Add(drTemp);
}
return dsTemp;
}
}
PS: 如果有新数据出现并且我没有拖动滚动条,它可以正常工作。
有什么想法吗? 谢谢!
【问题讨论】:
-
我错过了什么吗?您似乎在内部调用
ReceiveNewData。你不应该用UpdateEventArgs做点什么,然后调用BindNewData吗? -
是的,我在内部调用 ReceiveNewData。调用自身和调用 BindNewData 有什么区别吗?
-
我想我只是误读了您的代码,抱歉。但是,您似乎没有对
ex做任何事情。它应该包含正在接收的新数据还是在其他地方处理? -
没有。 UpdateEventArgs 告诉我收到的是哪种类型的数据,而不是数据本身,而且我现在没有使用它。数据在两个静态列表中(QuoteMember.listOneClickQuoteItem 和 QuoteMember.listMarketingQuoteItem)
标签: c# winforms controls invoke nullreferenceexception