2012-03-16 9 views
0

DataGridViewのすべてのデータを対応するDataTableに変換するルーチンがあります。このメソッドを拡張して、DataGridViewの選択範囲だけを変換する機能を組み込みたいと考えています。私は明らかに基本的な論理if (bIsSelection) /*Do stuff*/ else /*Do other stuff*/を使ってこれを行うことができますが、私はここでジェネリックを使いたいと思います。問題は、完全なDataGridViewの範囲がDataGridViewColumnCollectionであり、選択された範囲がDataGridViewSelectedColumnCollectionであり、C#が2つの間の変換を気にしていないように見えるか、またはジェネリックの場合に暗黙の型指定が可能であるということです。ジェネリックスを使用して明示的キャストを避ける方法

私のコードの最初の部分は

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

関連する問題