none
Exception при использовании BindingSource.Add() RRS feed

  • Вопрос

  • Добрый день всем!

    Никак не могу понять почему происходит Exception при добавлении элемента в DataTable посредством связанного BindingSource.

    Упростил свой код до следующего:

    var dt = new DataTable("TestTable", "TableNamespace");
                dt.Columns.Add(new DataColumn("AnyField", typeof(string)));
                var anyRow = dt.NewRow();
                anyRow["AnyField"] = "AnyData";
                dt.Rows.Add(anyRow);
    
                var bs = new BindingSource {DataSource = dt}; 
    
                try{  
                var bsRow = (DataRowView)bs.AddNew();
                bs.Add(bsRow);// <-- Exception здесь
                }
                catch(Exception ex) {
                    // thrown Exception Message: Cannot add external objects to this list.
                }

    Почему происходит Exception в указанной строке?

    24 июля 2012 г. 18:26

Ответы

  • Так, невнимательно я посмотрел на код. Вы один раз уже добавляете его в коллекцию, вызовом

    var bsRow = bs.AddNew();

    и получаете ссылку на добавленный элемент. Повторная добавка которого и выбрасывает исключение. Так что второй раз уже добавлять его не нужно.

    • Помечено в качестве ответа Varlamov Oleg 25 июля 2012 г. 9:13
    25 июля 2012 г. 8:09
    Модератор

Все ответы

  • А что за исключение вылетает, опишите?
    25 июля 2012 г. 5:51
    Модератор
  • System.ArgumentException: Cannot add external objects to this list.
       at System.Data.DataView.System.Collections.IList.Add(Object value)
       at System.Windows.Forms.BindingSource.Add(Object value)
       at TestBinding.TestForm.Form_Load(Object sender, EventArgs e) in D:\Work\TempProjects\TestBinding\TestBinding\TestForm.cs:line 28
    25 июля 2012 г. 6:23
  • var dt = new DataTable("TestTable", "TableNamespace");
          dt.Columns.Add(new DataColumn("AnyField", typeof(string)));
          var anyRow = dt.NewRow();
          anyRow["AnyField"] = "AnyData";
          dt.Rows.Add(anyRow);
    
          var bs = new BindingSource { DataSource = dt };
    
            var bsRow = bs.AddNew();
            string type1 = bsRow.GetType().Name;//Тип DataRowView
            //bs.List коллекция с элементами типа DataRow
            //Вы пытаетесь вставить объект типа DataRowView в коллекцию с типами DataRow
            //а это невозможно так как данные типы никак не связаны.
            bs.Add(bsRow);

    25 июля 2012 г. 7:03
    Модератор
  • bs.List - Коллекция с элементами типа DataView. Если я пытаюсь вставить объект другого типа, то выдавался бы другой Exception:

    System.InvalidOperationException: Objects added to a BindingSource's list must all be of the same type.
       at System.Windows.Forms.BindingSource.Add(Object value)
       at TestBinding.TestForm.Form_Load(Object sender, EventArgs e) in D:\Work\TempProjects\TestBinding\TestBinding\TestForm.cs:line 28

    Т.е. если я делаю так:

                var dt = new DataTable("TestTable", "TableNamespace");
                dt.Columns.Add(new DataColumn("AnyField", typeof(string)));
                var anyRow = dt.NewRow();
                anyRow["AnyField"] = "AnyData";
                dt.Rows.Add(anyRow);
                var bs = new BindingSource {DataSource = dt}; 
                try {
                    var bsRow = (bs.DataSource as DataTable).NewRow();
                    bs.Add(bsRow);
                }
                catch(Exception ex) {
    
                }

    И как же все-таки мне добавить строку через BindingSource

    25 июля 2012 г. 7:53
  • Так, невнимательно я посмотрел на код. Вы один раз уже добавляете его в коллекцию, вызовом

    var bsRow = bs.AddNew();

    и получаете ссылку на добавленный элемент. Повторная добавка которого и выбрасывает исключение. Так что второй раз уже добавлять его не нужно.

    • Помечено в качестве ответа Varlamov Oleg 25 июля 2012 г. 9:13
    25 июля 2012 г. 8:09
    Модератор
  • Спасибо. Точно.

    25 июля 2012 г. 9:13
  • Спасибо, что не забыли отметить ответ.


    Для связи [mail]

    27 июля 2012 г. 8:45