2012-04-13 5 views
1

まず、DataGridViewのdatacontextを汎用クラスCompanyから取得した匿名型に割り当てます。DataGridViewに表示するカラム名を取得するには、匿名型を使用することをお勧めします。DataGridView.SelectedItem [0] to GenericType

var companyData = (from c in dataContext.Companies 
      select new 
      { 
       Company =c.CompanyName, 
       City=c.City.CityName, 

      }); 

    dataGridView.DataContext = companyData; 

ここで、選択した行の値をMouseDoubleClickイベントの時刻に取得します。しかし問題は、匿名タイプをジェネリックタイプの会社に変換できないことです。

void dataGridView_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
{ 
      var selectedRow = dataGridView.SelectedItem[0]; 
      // How to convert selectedRow back to Company ? 
      // Anonymous type have no implementation of AsEnumerable. 
} 

私はこのような何かしたい:

Company company = selectedRow.Select(c=>new Company 
            (CompanyName=selectedRow.Company, 
            CityName=selectedRow.City); 

は、事前にありがとうございます。

+0

にDataGridViewRowを変換するしかし、私は、表示目的のために必要なカラム名を取得いけません。私は匿名タイプを使用する目的を述べました。 – Marshal

+0

ハックがありますが、これを行うためのクリーンな方法はないと思います。具体的なクラス(命名用)を作成し、匿名型の代わりにLINQクエリを使用してクラスオブジェクトのリストを作成する必要があります –

+0

なぜオブジェクトを会社に戻す必要がありますか?元の「会社」はどこから来たのですか? – phoog

答えて

1

使用拡張方法は、任意のタイプ

public static class DataGridViewRowWExtenstions 
    { 
     public static T GetObject<T>(this DataGridViewRow Row) where T : new() 
     { 
      List<PropertyInfo> properties = typeof(T).GetProperties().ToList(); 

      return CreateItemFromRow<T>(Row, properties); 
     } 

     private static T CreateItemFromRow<T>(DataGridViewRow row, List<PropertyInfo> properties) where T : new() 
     { 
      T item = new T(); 
      foreach (var property in properties) 
      { 
       if (row.DataGridView.Columns.Contains(property.Name)) 
       { 
        if (row.Cells[property.Name] != null) 
         property.SetValue(item, row.Cells[property.Name].Value, null); 
       } 
      } 
      return item; 
     } 
    } 



private void dataGridView2_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e) 
     { 
      DataGridViewRow selectedRow = dataGridView2.SelectedRows[0]; 
      Company company = selectedRow.GetObject<Company>(); 
     } 
関連する問題