将泛型列表/可枚举数据行添加到数据表

本文关键字:添加 数据表 数据 枚举 泛型 列表 | 更新日期: 2023-09-27 18:31:26

我正在尝试编写一个函数,该函数采用通用列表/枚举并将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;
             }
          }
       }
   }
}

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

将泛型列表/可枚举数据行添加到数据表

你需要移动"_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
   }