2012-04-13 4 views
1

Zuerst ich Datenkontext von DataGridView zu einem anonymen Typ, der von Generic Class erhalten wird Company Anonyme Art ist bevorzugt, um gewünschte Spaltennamen zur Anzeige in DataGridView erhalten.DataGridView.SelectedItem [0] to GenericType

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

      }); 

    dataGridView.DataContext = companyData; 

Jetzt möchte ich die Auswahl Zeile Werte zum Zeitpunkt der MouseDoubleClick-Ereignis. Aber das Problem ist, ich kann den anonymen Typ nicht zu meinem generischen Typ Firma konvertieren.

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. 
} 

Ich möchte etwas wie folgt aus:

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

Danke im Voraus.

+0

konvertieren Aber dann nicht ich gewünschten Spaltennamen für die Anzeige Zweck erhalten. Ich habe meinen Zweck erwähnt, anonymen Typ – Marshal

+0

zu verwenden. Ich glaube nicht, dass es einen saubereren Weg gibt, dies zu tun, obwohl es einige Hacks gibt. Sie sollten eine konkrete Klasse (für die Benennung) erstellen und eine Liste von Klassenobjekten über eine LINQ-Abfrage anstelle des anonymen Typs erstellen. –

+0

Warum müssen Sie das Objekt zurück in ein Unternehmen konvertieren? Woher kommt die ursprüngliche 'Company'? – phoog

Antwort

1

verwenden Sie Erweiterungsmethode DataGridViewRow auf jede Art

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>(); 
     } 
Verwandte Themen