1

まず、DataGridViewのデータコンテキストをジェネリッククラスから取得した匿名型に割り当てますCompany。匿名型は、DataGridViewに表示される目的の列名を取得するために推奨されます。

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

           });

    dataGridView.DataContext = companyData;

ここで、MouseDoubleClickイベント時にselect行の値を取得したいと思います。しかし、問題は、匿名型をジェネリック型のCompanyに戻すことができないことです。

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);

前もって感謝します。

4

1 に答える 1

1

Extensionメソッドを使用して、DataGridViewRowを任意のタイプに変換します

 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>();
        }
于 2012-04-13T06:22:38.140 に答える