2010-07-02 3 views
2

У меня есть данные, содержащие 17 столбцов и кучу данных.Datatable подмножество столбцов из другого типа данных

Я использую datatable только с 6 столбцами и данными для этих 6 столбцов.

Так что мне нужно подмножество оригинального datatable.

Как мне пройти через исходный тип данных с 17 столбцами и в конечном итоге получить данные с 6 столбцами, которые я хочу, с соответствующими данными для этих шести столбцов?

+0

Как вы изначально Наполнение DataTable? Если вы заполняете его из базы данных, это должно быть очень легко сделать, как вы запрашиваете с помощью команд SQL SELECT. –

ответ

2

Не зная больше о том, как родовое это должно быть его действительно просто ...

foreach (DataRow dr in dt.Rows) 
{ 
    newDt.Rows.Add(dr["col1"],dr["col5"],etc); 
} 
+0

Я верю, что здесь есть опечатка - вы хотите dt.Rows ["col5"], а не dr, не так ли? Или, альтернативно, у вас может быть dr ["col1"], dr ["col5"] ... – Melanie

+0

@Melanie Да, я думаю, что позже это правильно и что я думал, когда писал это (хотя это было три года назад и Я действительно не помню, чтобы ответить на это вообще ха-ха) ... отредактировал мой ответ, чтобы отразить вашу коррекцию – heisenberg

0

Что относительно типов данных и столбцов? эти же? если да, то вы можете создать

object[] row = new object[]{// Fill your rows manually}; 

перед заполнением его создания

DataTable dt = new DataTable(); 
dt.Columns.Add("Title",typeof(string etc..));..... 

и, наконец,

dt.Rows.Add(row); 
0

Лично я бы избегайте создания другого экземпляра DataTable.

Это зависит от вашей ситуации, конечно, но если это чисто для удобства использования, а не для безопасности (т. Е. Вы не пытаетесь удалить столбцы с конфиденциальными данными, прежде чем передавать их где-нибудь), тогда я бы создал объект-оболочку который инкапсулирует столбцы, которые вы хотите открыть.

Преимущество использования обертки в том случае, если вы выполняете какие-либо обновления, тогда вы можете обновить исходную таблицу напрямую, а не копию. Неважно, действительно ли это имеет значение, конечно, зависит от вашей ситуации.

Простой пример с ограниченной функциональностью:

public class MyFormOrPage 
{ 
    void UsageExample() 
    { 
     DataTable allDataTable = new DataTable(); 
     // populate the data table with whatever logic ... 

     // wrap the data table to expose only the Name, Address, and PhoneNumber columns 
     var limitedDataTable = new DataTableWrapper(allDataTable, "Name", "Address", "PhoneNumber"); 

     // iterate over the rows 
     foreach (var limitedDataRow in limitedDataTable) 
     { 
      // iterate over the columns 
      for (int i = 0; i < limitedDataTable.ColumnCount; i++) 
      { 
       object value = limitedDataRow[i]; 
       // do something with the value ... 
      } 
     } 

     // bind the wrapper to a control 
     MyGridControl.DataSource = limitedDataTable; 
    } 
} 

public class DataTableWrapper : IEnumerable<DataRowWrapper> 
{ 
    private DataTable _Table; 

    private string[] _ColumnNames; 

    public DataTableWrapper(DataTable table, params string[] columnNames) 
    { 
     this._Table = table; 

     this._ColumnNames = columnNames; 
    } 

    public int ColumnCount 
    { 
     get { return this._ColumnNames.Length; } 
    } 

    public IEnumerator<DataRowWrapper> GetEnumerator() 
    { 
     foreach (DataRow row in this._Table.Rows) 
     { 
      yield return new DataRowWrapper(row, this._ColumnNames); 
     } 
    } 

    #region IEnumerable Members 

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
    { 
     return this.GetEnumerator(); 
    } 

    #endregion 

    // if you _really_ want to make a copy of the DataTable, you can use this method 
    public DataTable CopyToDataTable() 
    { 
     DataTable copyTable = new DataTable(); 
     for (int index = 0; index < this._ColumnNames.Length; index++) 
     { 
      DataColumn column = this._Table.Columns[index]; 
      copyTable.Columns.Add(column); 
     } 
     foreach (DataRow row in this._Table.Rows) 
     { 
      DataRow copyRow = copyTable.NewRow(); 
      for (int index = 0; index < this._ColumnNames.Length; index++) 
      { 
       copyRow[index] = row[this._ColumnNames[index]]; 
      } 
      copyTable.Rows.Add(copyRow); 
     } 
     return copyTable; 
    } 
} 

// let's make this a struct, since potentially very many of these will be instantiated 
public struct DataRowWrapper 
{ 
    private DataRow _Row; 

    private string[] _ColumnNames; 

    public DataRowWrapper(DataRow row, params string[] columnNames) 
    { 
     this._Row = row; 

     this._ColumnNames = columnNames; 
    } 

    // use this to retrieve column values from a row 
    public object this[int index] 
    { 
     get { return this._Row[this._ColumnNames[index]]; } 
     set { this._Row[this._ColumnNames[index]] = value; } 
    } 

    // just in case this is still needed... 
    public object this[string columnName] 
    { 
     get { return this._Row[columnName]; } 
     set { this._Row[columnName] = value; } 
    } 
} 
2
Private Function createSmallCopyofExistingTable(ByVal SourceTable As DataTable) As DataTable 
    Dim newTable As DataTable = New DataTable() 

    'Copy Only 6 columns from the datatable 
    Dim ColumnsToExport() As String = {"ID", "FirstName", "LastName", "DateOfBirth", "City", "State"} 

    newTable = SourceTable.DefaultView.ToTable("tempTableName", False, ColumnsToExport) 



    Return newTable 
End Function 
Смежные вопросы