Простий спосіб перетворити масив рядків даних на таблицю даних


Відповіді:


91

Чому б не пройти ітерацію через масив DataRow та додати (за потреби, використовуючи DataRow.ImportRow, щоб отримати копію DataRow), щось на зразок:

foreach (DataRow row in rowArray) {
   dataTable.ImportRow(row);
}

Переконайтеся, що ваша таблиця даних має таку саму схему, що і DataRows у вашому масиві DataRow.


1
Цей прийом корисний, якщо ви отримуєте повідомлення про помилку "Неправильне джерело даних використовується для MyControl. Дійсне джерело даних повинно реалізовувати або IListSource, або IEnumerable", намагаючись прив'язати DataRow безпосередньо до властивості DataSource управління. Ось як це зробити:DataTable dataTable = new DataTable(); dataTable.ImportRow(dataRow); MyControl.DataSource = dataTable;
humbads

+1 Я віддаю перевагу цьому, а не rowArray.CopyToDataTable();тому, що це зберігає схему таблиці і не замінює її новим об’єктом таблиці!
Мойтаба Резайан

7
Дуже добре ! Але я б запропонував клонувати DataTable перед виступом. Він копіює формат DataTable: newDataTable = oldDataTable.clone ();
Whiplash

2
Підказка: у вашій таблиці даних повинні бути створені стовпці, інакше вона не заповнюється належним чином.
логіксолог

192

Для .Net Framework 3.5+

DataTable dt = new DataTable();
DataRow[] dr = dt.Select("Your string");
DataTable dt1 = dr.CopyToDataTable();

Але якщо в масиві немає рядків, це може спричинити помилки, такі як джерело не містить DataRows . Тому, якщо ви вирішили використовувати цей метод CopyToDataTable(), вам слід перевірити масив, щоб знати, чи він має дані чи ні.

if (dr.Length > 0)
    DataTable dt1 = dr.CopyToDataTable();

Довідка доступна на MSDN: DataTableExtensions.CopyToDataTable метод (IEnumerable)


1
Звідки ти взявся copyToDataTable()? Я не знайшов його у .net 2.0
SMUsamaShah

11
Це слід позначити як правильну відповідь, оскільки copyToDataTable()метод створює ідеальну копію стовпців вибраних рядків, тоді як datatable.ImportRow(row)метод цього не робить
Данте

5
цей спосіб не є гарним, якщо в таблиці вже є рядки, оскільки це замінить все, що вже є. Якщо таблиця порожня для початку, це добре.
Франк

5
Я віддаю перевагу цьому методу до тих пір, поки оптимізовані функції .Net. Не забудьте додати посилання на System.Data.DataSetExtensions у своєму проекті, щоб у вас не було роздратування, запитуючи себе, чому цей метод відсутній (як я)
Broken_Window

Не забудьте додати System.Data.DataSetExtensions Assembly у посиланнях
Vagner Gon

12
DataTable dt = new DataTable(); 

DataRow[] dr = (DataTable)dsData.Tables[0].Select("Some Criteria");

dt.Rows.Add(dr);

2
Я вже намагався так .. Помилка виникає щось на кшталт "Вхідний масив довший, ніж кількість стовпців у цій таблиці".
Developer404

Як зазначав Джей, переконайтеся, що ваша таблиця даних має таку ж схему, що і DataRows у вашому масиві DataRow
Mitch Wheat

1
Так .. Я спробував. Я використовував Datatable1 = datatable2.Clone (); Зараз це працює ... Дякую :-)
Developer404

Я спробував це з масивом рядків, і це не вийшло. Для кожного рядка в масиві рядків я створив новий рядок, скопіював властивість ItemArray з вихідного рядка, а потім додавання спрацювало.
Стів

1
Здається, це не працює в .NET Framework 4.0 із зразком, який розміщений, а також із клонуванням "dt" з dstata.tables [0]. @ Joe відповідь закінчилася для моїх цілей. Помилка версії без клонування: " Input array is longer than the number of columns in this table.". Помилка версії With-Clone Version: " Unable to cast object of type 'System.Data.DataRow' to type 'System.IConvertible'.Couldn't store <System.Data.DataRow> in StoreOrder Column. Expected type is Int64." Примітка: StoreOrderце перший стовпець у схемі таблиці. Здається, він намагається забити цілий datarow в першу колонку
Брайан Вебстер

11

Інший спосіб - використання DataView

// Create a DataTable
DataTable table = new DataTable()
...

// Filter and Sort expressions
string expression = "[Birth Year] >= 1983"; 
string sortOrder = "[Birth Year] ASC";

// Create a DataView using the table as its source and the filter and sort expressions
DataView dv = new DataView(table, expression, sortOrder, DataViewRowState.CurrentRows);

// Convert the DataView to a DataTable
DataTable new_table = dv.ToTable("NewTableName");

9

Простий спосіб:

// dtData is DataTable that contain data
DataTable dt = dtData.Select("Condition=1").CopyToDataTable();

// or existing typed DataTable dt
dt.Merge(dtData.Select("Condition=1").CopyToDataTable());



4
DataTable Assetdaterow =
    (
        from s in dtResourceTable.AsEnumerable()
        where s.Field<DateTime>("Date") == Convert.ToDateTime(AssetDate)
        select s
    ).CopyToDataTable();

3

.Net 3.5+ додано DataTableExtensions, використовуйте метод DataTableExtensions.CopyToDataTable

Для масиву даних просто використовуйте .CopyToDataTable (), і він поверне дані.

Для одноразового використання даних

new DataRow[] { myDataRow }.CopyToDataTable()

2

Ось рішення. Це повинно працювати нормально.

DataTable dt = new DataTable();
dt = dsData.Tables[0].Clone();
DataRows[] drResults = dsData.Tables[0].Select("ColName = 'criteria');

foreach(DataRow dr in drResults)
{
    object[] row = dr.ItemArray;
    dt.Rows.Add(row);
} 

1

У випадку, коли хтось потребує цього у VB.NET:

Dim dataRow as DataRow
Dim yourNewDataTable as new datatable
For Each dataRow In yourArray
     yourNewDataTable.ImportRow(dataRow)
Next

1

Ви можете використовувати System.Linq так:

if (dataRows != null && dataRows.Length > 0)
{
   dataTable = dataRows.AsEnumerable().CopyToDataTable();
}

1

Спочатку потрібно клонувати структуру таблиці даних, а потім імпортувати рядки, використовуючи для циклу

DataTable dataTable =dtExisting.Clone();
foreach (DataRow row in rowArray) {
   dataTable.ImportRow(row);
}

0
DataTable dataTable = new DataTable();
dataTable = OldDataTable.Tables[0].Clone();
foreach(DataRow dr in RowData.Tables[0].Rows)
{
 DataRow AddNewRow = dataTable.AddNewRow();
 AddNewRow.ItemArray = dr.ItemArray;
 dataTable.Rows.Add(AddNewRow);
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.