首页 文章

将通用列表/可枚举DataRow添加到DataTable?

提问于
浏览
0

我正在尝试编写一个函数,该函数采用通用List / Enumerable并将DataRow添加到现有DataTable,但仅用于自定义列 .

public void AddGridRow<T>(IEnumerable<T> rowData, params String[] columnNames)
{
  HashSet<String> columnsHashSet = new HashSet<String>(columnNames);

  PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));
  foreach (T item in rowData)
  {
      foreach (PropertyDescriptor prop in properties)
      {
         foreach (DataColumn column in _dataGridTable.Columns)
         {
             DataRow newRow = _dataGridTable.NewRow();
             if (columnsHashSet.Contains(prop.Name))
             {
                 newRow[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
                 _dataGridTable.Rows.Add(newRow); // _dataGridTable is my existing DataTable
                break;
             }
          }
       }
   }
}

现在问题是它的行为不正确,假设我必须在4列(columnNames)中添加1行,它每列添加1行 . 还有很多foreach循环 . 我该如何纠正这一点,如果可能的话,优化它 .

1 回答

  • 2

    你需要移动“_dataGridTable.Rows.Add(newRow);”内部foreach循环之外的行:

    foreach (T item in rowData)
      {
          foreach (PropertyDescriptor prop in properties)
          {
             DataRow newRow = _dataGridTable.NewRow();
             foreach (DataColumn column in _dataGridTable.Columns)
             {
                 if (columnsHashSet.Contains(prop.Name))
                 {
                     newRow[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
                    break;
                 }
              }
           }
          _dataGridTable.Rows.Add(newRow); // _dataGridTable is my existing DataTable
       }
    

相关问题