gpt4 book ai didi

c# winform Invoke 抛出 NullReferenceException

转载 作者:行者123 更新时间:2023-11-30 18:41:48 24 4
gpt4 key购买 nike

我正在开发 winform(mdi) 专业版。当我从另一个线程获取新数据时,我需要更新 dataGridView 控件。当新数据出现并且我正在拖动 dataGridview 滚动条时,它会在 dataGridView.Invoke 中引发 nullreference 异常。我搜索了几天,把谷歌逼疯了,但没有帮助。代码如下:

  
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;
}
}






附言: 如果有新数据出现并且我没有拖动滚动条,它工作正常。

有什么想法吗?谢谢!

最佳答案

我发现当您调用控件并设置绑定(bind)(或清除它们)时并且对象设置为 null 这会引发 null 引用异常,这通过调用给出错误反射(reflect)出来,但是此错误在您的代码中的其他地方:

简单示例:

public class test : Form
{
public test()
{
Thread t = new Thread(start);
t.Start();
}
public void start()
{
LoadCompleteEvent();
}
public void LoadComplete() //fired by LoadCompleteEvent();
{
if(this.InvokeIsRequired)
{
//do invoke
//and return
}

comboBoxEditBrand.Properties.Items.Clear();
comboBoxEditBrand.Properties.Items.AddRange(ListOfStuff.ToArray());
}
public void comboBoxEditBrand_SelectedItemChanged(object sender, eventargs e) // fired as control is changed
{
//error here!!
if(comboBoxEditBrand.SelectedItem == SomeBrandItem) //<- this is where the error is thrown!! check for null first!
{
//do something
}
}
}

它是这样的.. 这段代码可能不会抛出错误,因为 A) 它来 self 的头顶,B) 它是编造的。但是,这让我困扰了半个上午,为什么会抛出这个错误。

只是放置

if(comboBoxEditBrand.SelectedItem == null)
return;

这里写着//error!!它应该会再次工作。

关于c# winform Invoke 抛出 NullReferenceException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6434254/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com