c#winform调用引发NullReferenceException

| 我正在开发winform(mdi)专业版。当我从另一个线程获取新数据时,我需要更新dataGridView控件。当新数据到来并且我拖动dataGridview滚动时,它将在dataGridView.Invoke中引发nullreference异常。我搜索了几天,让Google疯狂,但没有帮助。 像这样的代码:
  
    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:   如果有新数据,但我没有拖动滚动条,则可以正常工作。 有任何想法吗? 谢谢 !     
已邀请:
        我发现当您调用控件并设置绑定(或清除绑定)时 并且将一个对象设置为null会抛出一个null引用异常,这可以通过调用给出错误来反映,但是此错误在代码中的其他地方: 快速示例:
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)是从我的头顶开始的,而B)是由我组成的。但是,这就是为什么我半天不安,为什么会抛出此错误。 只是地方
if(comboBoxEditBrand.SelectedItem == null)
  return;
//这里的错误!它应该可以再次工作。     
        确保在调用之前切换到Gui线程     

要回复问题请先登录注册