How to bind Gridview using Linq (Join) and access the value of gridview cell

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;

  }

}

2 comments: