2012-03-16 2 views
0

У меня есть программа, которая преобразует все данные в DataGridView в соответствующий DataTable. Я хочу расширить этот метод, чтобы включить возможность конвертировать только выбранный диапазон DataGridView. Я могу это сделать, используя базовую логику if (bIsSelection) /*Do stuff*/ else /*Do other stuff*/, но я хотел бы использовать здесь дженерики. Проблема в том, что полный диапазон DataGridView - это DataGridViewColumnCollection, а выбранный диапазон будет DataGridViewSelectedColumnCollection, а C#, похоже, не нравится какое-либо преобразование между ними или допускает неявное типирование в случае дженериков.Как избежать явного литья с использованием Generics

Первая часть моего кода была

public static DataTable BuildDataSetFromDgv(DataGridView _dataGridView, 
    string strTabName) 
{ 
    DataTable dt = new DataTable(); 

    dt.TableName = strTabName; 
    foreach (DataGridViewColumn col in _dataGridView.Columns) 
     dt.Columns.Add(col.DataPropertyName, col.ValueType); 

и я попытался

public static DataTable BuildDataSetFromDgv<T>(DataGridView _dataGridView, 
    string strTabName, ICollection<T> _columnColl, ICollection<T> _rowColl) 
{ 
    DataTable dt = new DataTable(); 

    dt.TableName = strTabName; 
    //foreach (DataGridViewColumn col in _dataGridView.Columns) 
    foreach (DataGridViewColumn col in _columnColl) 
     dt.Columns.Add(col.DataPropertyName, col.ValueType); 

который не работает из-за неявное преобразование и изменениями _columnColl в _columnColl as DataGridView[Selected]ColumnCollection поражениях объективного.

Как это сделать с использованием дженериков в этом случае?

Спасибо за ваше время.

+1

Обратите внимание, что обе эти коллекции реализуют 'ICollection'. –

+0

Спасибо. Я набрал это на лету ... – MoonKnight

ответ

3

Я не уверен, почему вам нужен общий - оба являются коллекцией DataGridViewColumn. Например, почему ниже не должно работать на вас

public static DataTable BuildDataSetFromDgv(DataGridView _dataGridView, 
    string strTabName, IEnumerable columns) 
{ 
    DataTable dt = new DataTable(); 
    dt.TableName = strTabName; 

    var dvgColumns = columns.Cast<DataGridViewColumn>(); 
    foreach (var col in dvgColumns) 
     dt.Columns.Add(col.DataPropertyName, col.ValueType); 
+0

+1 Отличный ответ. Я не был знаком с этим типом кастинга. – MoonKnight

Смежные вопросы