Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to bind complex type properties to a datagrid?

Tags:

How would I go about binding the following object, Car, to a gridview?

 public class Car {    long Id {get; set;}    Manufacturer Maker {get; set;} }  public class Manufacturer {    long Id {get; set;}    String Name {get; set;} } 

The primitive types get bound easy but I have found no way of displaying anything for Maker. I would like for it to display the Manufacturer.Name. Is it even possible?

What would be a way to do it? Would I have to store ManufacturerId in Car as well and then setup an lookupEditRepository with list of Manufacturers?

like image 856
Xerx Avatar asked Sep 23 '08 14:09

Xerx


1 Answers

Allright guys... This question was posted waaay back but I just found a fairly nice & simple way to do this by using reflection in the cell_formatting event to go retrieve the nested properties.

Goes like this:

    private void Grid_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)     {          DataGridView grid = (DataGridView)sender;         DataGridViewRow row = grid.Rows[e.RowIndex];         DataGridViewColumn col = grid.Columns[e.ColumnIndex];         if (row.DataBoundItem != null && col.DataPropertyName.Contains("."))         {             string[] props = col.DataPropertyName.Split('.');             PropertyInfo propInfo = row.DataBoundItem.GetType().GetProperty(props[0]);             object val = propInfo.GetValue(row.DataBoundItem, null);             for (int i = 1; i < props.Length; i++)             {                 propInfo = val.GetType().GetProperty(props[i]);                 val = propInfo.GetValue(val, null);             }             e.Value = val;         }     } 

And that's it! You can now use the familiar syntax "ParentProp.ChildProp.GrandChildProp" in the DataPropertyName for your column.

like image 188
koni Avatar answered Sep 20 '22 16:09

koni