Your Privacy Matters: We use our own and third-party cookies to improve your experience on our website. By continuing to use the website we understand that you accept their use. Cookie Policy
535
Binding grid to LINQ
posted

I am binding a grid to a linq statement which creates an anonymous type class for the data. When I try and get to the data in the InitializeRow event, I'm having a problem casting the row properly. If I create a class for the linq results, it's easy, but I don't want to create a new class for every linq statement. For example:

var rows= from r in db.table select new {id=xxxx, value=yyyy}  <-- this creates an anonymous type versus....

var rows= from r in db.table select rowclass new {id=xxxx, value=yyyy}

class rowclass {int id, string yyyy}, which gives me a collection of rowclass.

Any ideas on how to access the data when using anonymous classes? thanks.

Parents
  • 28464
    posted

    A very interesting case, thanks for sharing in forums. I also reproduced something similar to that, based on simple SQL data. Here is my setup based on a simple datatable with ID (int) and Name (string) columns:

    <igtbl:UltraWebGrid ID="UltraWebGrid1" runat="server" oninitializerow="UltraWebGrid1_InitializeRow">

    and here is my binding code:

    {
        protected void Page_Load(object sender, EventArgs e)
        {
            DataClassesDataContext dataContext = new DataClassesDataContext();

            var industries = from p in dataContext.Industries
                             select new
                             {
                                 ID = p.ID,
                                 Name = p.Name
                             };

            UltraWebGrid1.DataSource = industries;
            UltraWebGrid1.DataBind();
        }

    If I am using anonymous types, e.Data.GetType() in the oninitializerow event handler returns the following type:

    {Name = "<>f__AnonymousType0`2" FullName = "<>f__AnonymousType0`2[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"}    System.Type {System.RuntimeType}

    No matter what I tried, I was not able to find an elegant way to retrieve ID and Name there. I guess, this is by design in the .NET Framework - if we are using anonymous types, we are just using them for binding and not in code-behind and this is how we achieve the speed upgrade of anonymous types. If we do need to use the data in code-behind, then we must resort to classes/instances.

    By the way, I was still able to get ID/Name for anonymous types in oninitializerow, however I am using reflection, and I am not sure that the cost of using reflection makes this approach useless (and it is a little bit ugly approach).

        protected void UltraWebGrid1_InitializeRow(object sender, Infragistics.WebUI.UltraWebGrid.RowEventArgs e)
        {

            PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(e.Data);

            int id = (int) pdc["ID"].GetValue(e.Data);
            string name = pdc["Name"].GetValue(e.Data) as string;
        }

    You can also try to obtain ID / Name directly from the Cells of the Row - they should already be available in InitializeRow. 

    If you believe this approach is applicable, let us know. Any other ideas on this interesting topic are more than welcome.. 

     

Reply Children