c # winform Invoke создает исключение NullReferenceException - PullRequest
3 голосов
/ 22 июня 2011

я работаю над winform (mdi) pro.И мне нужно обновить элемент управления dataGridView, когда я получаю новые данные из другого потока.и когда приходят новые данные, и я перетаскиваю свиток dataGridview, он генерирует исключение нулевой ссылки в dataGridView.Invoke.Я искал несколько дней и сводил 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: если приходят новые данные, а я не перетаскиваю полосу прокрутки, все работает нормально.

есть идеи?спасибо!

Ответы [ 2 ]

1 голос
/ 07 марта 2012

Я обнаружил, что когда вы вызываете элемент управления и устанавливаете привязки (или очищаете их) и объект установлен в нуль, это может выдать исключение нулевой ссылки, это отражается через invoke, выдавая ошибку, однако эта ошибка находится где-то еще в вашем коде:

быстрый пример:

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;

где написано // ошибка здесь !! и это должно снова сработать.

0 голосов
/ 22 июня 2011

Убедитесь, что вы переключаетесь на поток Gui, прежде чем вызывать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...