none
Как скопировать данные из одного DataTable в другой RRS feed

  • Общие обсуждения

  • Во первых, нужно выполнить итерацию по всем элементам коллекции DataTable.Rows, затем:

    1) если целевой и исходный объекты DataTable имеют одинаковые схемы, то можно просто воспользоваться методом DataTable.ImportRow чтобы добавить и заполнить новую запись данных

       foreach (DataRow row in Table1.Rows)
       {
         Table2.ImportRow(row);
       }

    2) если целевой и исходный объекты DataTable имеют разные схемы, то для целевой таблицы нужно создать новую строку, вызвав NewRow(), заполнить ее и добавить в коллекцию строк

       foreach (DataRow row in dt.Rows)
       {
         DataRow newRow = Table2.NewRow();
         newRow["MyTable2Column"] = row["MyTable1Column"];
         Table2.Rows.Add(newRow);
       }

    3 ноября 2010 г. 12:23

Все ответы

  • Тема стара, но все же есть вопрос. Если у меня есть DataTable1 и я хочу допустим выбрать с помощью фильтра или проверки на совпадения имен столбцов данные и поместить их в др. DataTable2, как это реализовать?

    Например вот по такому условию:

    string[] filter={"ZZ1", "A", "D"};
    for (int i=1;i<=filter.Length;i++)
     if (Table1.Columns.Contains(filter[i-1])==true)
    {
      //тогда помещаем данные в Table2, как это сделать???
    }


  • Не совсем правильно бежать по фильтру. Надо бежать по колонкам:

    string[] filter={"ZZ1", "A", "D"};
    for (int i=1;i<=Table1.Columns.Count;i++)
    if (filter.Contains(Table1.Columns[i].ColumnName) == true)
    {
      Table2.Columns.Add(Table1.Columns[i]);
    }
    Тогда есть, что добавлять :)
    • Изменено xjomanx 20 мая 2015 г. 7:19
  • Так фильтр это  и есть название колонок Table1 (это DataTable1), которые нужно добавить  (с данными этих колонок) в Table2  (это DataTable2).



    • Изменено AlexFV 20 мая 2015 г. 17:52
  • Так фильтр это  и есть название колонок Table1 (это DataTable1), которые нужно добавить  (с данными этих колонок) в Table2  (это DataTable2).



    Не совсем понял высказывание. Вопрос был про копирование названий колонок по фильтру. Собственно мой код выше это и делает.

    Чтобы скопировать данные, необходимо после копирования колонок бежать по строкам первой таблицы и копировать данные для сущестующих в Table2 столбцов. Примерный код:

    foreach (var Tab1Row in Table1.Rows) //Бежим по строкам
    {
      DataRow row;
      // Формируем строку (бежим по колонкам и ищем совпадающие названия
      foreach (var Tab1Column in Table1.Columns)
      {
        if (Table2.Columns.Contains(Tab1Column.ColumnName))
        {
          // Если Table2 содержит колонку с именем Tab1Column.ColumnName, копируем данные.
          row[Tab1Column.ColumnName] = Tab1Row[Tab1Column.ColumnName];
        }
      }
      // Добавляем строку
      Table1.Rows.Add(row);
    }
    Собственно ничего сложного, код такой же как и выше, только добавляется еще один цикл.
    • Изменено xjomanx 21 мая 2015 г. 7:37
  • Нет вопрос был не про копирования НАЗВАНИЯ колонок, а про сравнение имени колонок, которые указаны в фильтре и при совпадении имен взять эту колонку со строками (сразу не бегая по строкам, так как строк за 10000) и записать в DataTable №2 (имя в данном случае Table2).

    Тут что то не то 

    row[Tab1Column.ColumnName] = Tab1Row[Tab1Column.ColumnName];

    нужно ведь копировать данные с таблицы одной (Table1) в другую (Table2). Кстати имена столбцов взяты с Excel и их не надо выделять отдельно в ColumnName хотя и можно это сделать, но не вижу смысла пока.

    • Изменено AlexFV 21 мая 2015 г. 18:14
  • Что же там не то?

    В этой строке, на сколько я понимаю, выполняется: в строку row в колонку с названием Tab1Column.ColumnName пишется значение из строки Tab1Row из колонки с названием Tab1Column.ColumnName собственно тем же самым, Вам же нужно перенести данные из одноимённых колонок?

    Касаемо:

    Нет вопрос был не про копирования НАЗВАНИЯ колонок, а про сравнение имени колонок, которые указаны в фильтре и при совпадении имен взять эту колонку со строками (сразу не бегая по строкам, так как строк за 10000) и записать в DataTable №2 (имя в данном случае Table2).

    Читаем это: https://msdn.microsoft.com/ru-ru/library/system.data.datatable_members%28v=vs.90%29.aspx

    и это: https://msdn.microsoft.com/ru-ru/library/system.data.datatable.columns%28v=vs.90%29.aspx

    В частности, во второй ссыле:

    Коллекция DataColumnCollection определяет схему таблицы путем определения типа данных для каждого столбца.

    Из этого абзац следует, что DataColumnCollection не содержит никаких данных, а только определяет схему таблицы.

    Таким образом, данные можно копировать только одним способом: брать их из строк.

    P.S. скопировать данные можно также через DataRowCollection (Table1.Rows) используя select и лямбды, но я почти уверен, что, все равно, программа будет бежать по каждой строке и выигрыша у вас не будет, разве что эстетическое удовольствие.

    P.P.S. Что то мне подсказывает, что select не получится использовать....
    • Изменено xjomanx 22 мая 2015 г. 7:07 добавил P.P.S.
  • Вы все правильно пишите для БД SQL, у меня же данные взяты с Excel файла, как названия колонок, так и строки. Как Вы понимаете в первой строке идут названия, каждой колонки, а во второй и до конца сами данные. Поэтому я взял и весь файл Excel поместил в DataTable1, но пользователю все данные пока не нужны, поэтому через фильтр я выбираю нужные строки и пытаюсь записать в другой DataTable2. 

    for (int i = 0; i < filter.Length; ++i)
                {
                    if (Table1.Columns.Contains(filter[i]) == true)
                    {
                        DataColumn copyData = Table1.Columns[filter[i]];
                        Table1.Columns.Remove(copyData);
                        Table2.Columns.Add(copyData);
    // колонки записал, теперь осталось записать строки из этих колонок, но считывать не построчно, а сразу все строки
                    }
                 }      
    Записал перемещение так, как через Copy пока ругается не пойму пока почему.


    • Изменено AlexFV 22 мая 2015 г. 17:33
  • AlexFaraonCar, любезный, зачем вы влезли в обучающую тему со своим вопросом?

    Abolmasov Dmitry создал эту тему, чтобы показать, как можно скопировать данные.

    Если у вас есть вопрос, создайте отдельную тему (которая и так у вас есть) и там спрашивайте. При этом могли бы дать ссылку на эту тему: мол, делал вот так, это получилось, это нет, что предпринять?

    -----

    Что делает пользователь с итоговым DataTable? Скорей всего он знать не знает о его существовании, а видит перед собой DataGrid или другой графический интерфейс. Вот в этом интерфейсе и скрывайте ненужные колонки. Для этого есть свойства у датагрида.

  • Может я действительно влез в данную тему, автору темы приношу извинения, просьба модераторов, если есть нарушения, перенести мои вопросы в отдельную тему. Спасибо за идею.