In this post i am going to show how to read the value of GridView cell when the DataSource is anonymous type.
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default3.aspx.cs" Inherits="Default3" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> </div> <asp:GridView ID="GridView1" runat="server" OnRowDataBound="GridView1_RowDataBound"> </asp:GridView> </form> </body> </html>
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data; public partial class Default3 : System.Web.UI.Page { /// <summary> /// Generic function for coverting object type to Desired type /// http://tomasp.net/blog/cannot-return-anonymous-type-from-method.aspx /// </summary> /// <typeparam name="T"></typeparam> /// <param name="obj"></param> /// <param name="type"></param> /// <returns></returns> T Cast<T>(object obj, T type) { return (T)obj; } /// <summary> /// Function return collection of Product and category table as anonymous type /// </summary> /// <returns></returns> private object ProductCategory() { var query = from p in new Product().GetProducts() join c in new Category().Categories() on p.CategoryId equals c.CategoryId select new { ProductName = p.ProductName, UnitPrice = p.UnitPrice, }; return query; } protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { BindGridView(); } } private void BindGridView() { GridView1.DataSource = ProductCategory(); GridView1.DataBind(); } protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { // This line will get the reference to the underlying row object objItem = e.Row.DataItem; //this is the hack // This call to 'Cast' method converts first parameter (object) to the // same type as the type of second parameter - which is in this case // anonymous type with 'ProductName' and 'UnitPrice' properties var _row = Cast(objItem, new { ProductName = "", UnitPrice = ((decimal?)0.0m) }); if (_row != null) { // get the field value which you want to compare and // convert to the corresponding data type decimal? _field = _row.UnitPrice; if (_field.Value > 12) e.Row.BackColor = System.Drawing.Color.Green; else e.Row.BackColor = System.Drawing.Color.Red; } } } } public class Product { public int ProductId { get; set; } public string ProductName { get; set; } public int CategoryId { get; set; } public decimal? UnitPrice { get; set; } public List<Product> GetProducts() { List<Product> products = new List<Product>(); products.Add(new Product { ProductId = 1, CategoryId = 1, ProductName = "P001", UnitPrice = 12.00m }); products.Add(new Product { ProductId = 2, CategoryId = 2, ProductName = "P002", UnitPrice = 12.00m }); products.Add(new Product { ProductId = 3, CategoryId = 1, ProductName = "P003", UnitPrice = 12.45m }); products.Add(new Product { ProductId = 4, CategoryId = 3, ProductName = "P004", UnitPrice = 11.00m }); products.Add(new Product { ProductId = 5, CategoryId = 3, ProductName = "P005", UnitPrice = 2.00m }); products.Add(new Product { ProductId = 6, CategoryId = 3, ProductName = "P006", UnitPrice = 112.00m }); products.Add(new Product { ProductId = 7, CategoryId = 1, ProductName = "P007", UnitPrice = 122.00m }); products.Add(new Product { ProductId = 8, CategoryId = 2, ProductName = "P008", UnitPrice = 121.00m }); products.Add(new Product { ProductId = 9, CategoryId = 1, ProductName = "P009", UnitPrice = 120.00m }); return products; } } public class Category { public int CategoryId { get; set; } public string CategoryName { get; set; } public List<Category> Categories() { List<Category> list = new List<Category>() { new Category{ CategoryId=1,CategoryName="C001"}, new Category{ CategoryId=2,CategoryName="C002"}, new Category{ CategoryId=3,CategoryName="C003"}, new Category{ CategoryId=4,CategoryName="C004"}, }; return list; } }


