Wednesday, September 9, 2015

ASP.NET Change GridView Sort Link Color

Here's how to change the color of GridView SortLink using CSS.
ASPX Markup
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<asp:GridView ID="GridVwPagingSorting" runat="server" AutoGenerateColumns="False" Font-Names="Verdana" AllowPaging="True" AllowSorting="True" PageSize="5" Width="75%" OnPageIndexChanging="PageIndexChanging" BorderColor="#CCCCCC" BorderStyle="Solid" BorderWidth="1px" OnSorting="Sorting">
    <AlternatingRowStyle BackColor="#BFE4FF" />
    <PagerStyle BorderColor="#CCCCCC" BorderStyle="Solid" BorderWidth="1px" />
    <HeaderStyle CssClass="gridViewHeader" />
    <RowStyle Height="20px" Font-Size="13px" BorderColor="#CCCCCC" BorderStyle="Solid" BorderWidth="1px" />
    <Columns>
        <asp:BoundField DataField="EmployeeID" HeaderText="Employee ID" SortExpression="EmployeeID" />
        <asp:BoundField DataField="Emp_Name" HeaderText="Employee Name" SortExpression="Emp_Name" />
        <asp:BoundField DataField="Address" HeaderText="Address" SortExpression="Address" />
        <asp:BoundField DataField="Country" HeaderText="Country" SortExpression="Country" />
    </Columns>
</asp:GridView>
CSS
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
.gridViewHeader 
 {
    height: 30px;
    background-color: #6DC2FF;
    font-size: 15px;
    border-color: #CCCCCC;
    border-style: Solid;
    border-width: 1px;
}

.gridViewHeader a {
    color: rgb(218, 81, 81);
}
Output

Alphabetical Paging in ASP.NET MVC (C#)

Here's the C# version of Alphabetic Paging in VB.NET Posts:
1. Alphabetical Paging in ASP.NET MVC
2. Alphabetical-Paging-in-ASP-NET-MVC Source Code
Solution Structure
HtmlHelpers.cs
 using System;  
 using System.Collections.Generic;  
 using System.Linq;  
 using System.Web;  
 using System.Text;  
 using System.Web.Mvc;  
 namespace MVCAlphabeticPager.Helpers  
 {  
   public static class HtmlHelpers  
   {  
     public static HtmlString AlphabeticalPager(this HtmlHelper html, string selectedLetter, IEnumerable<string> firstLetters, Func<string, string> pageLink)  
     {  
       var sb = new StringBuilder();  
       var numbers = Enumerable.Range(0, 10).Select(i => i.ToString());  
       var alphabet = Enumerable.Range(65, 26).Select(i => ((char)i).ToString()).ToList();  
       alphabet.Insert(0, "All");  
       alphabet.Insert(1, "0-9");  
       var ul = new TagBuilder("ul");  
       ul.AddCssClass("pagination");  
       ul.AddCssClass("alpha");  
       foreach (var letter in alphabet)  
       {  
         var li = new TagBuilder("li");  
         if (firstLetters.Contains(letter) || (firstLetters.Intersect(numbers).Any() && letter == "0-9") || letter == "All")  
         {  
           if (selectedLetter == letter || string.IsNullOrEmpty(selectedLetter) && letter == "All")  
           {  
             li.AddCssClass("active");  
             var span = new TagBuilder("span");  
             span.SetInnerText(letter);  
             li.InnerHtml = span.ToString();  
           }  
           else  
           {  
             var a = new TagBuilder("a");  
             a.MergeAttribute("href", pageLink(letter));  
             a.InnerHtml = letter;  
             li.InnerHtml = a.ToString();  
           }  
         }  
         else  
         {  
           li.AddCssClass("inactive");  
           var span = new TagBuilder("span");  
           span.SetInnerText(letter);  
           li.InnerHtml = span.ToString();  
         }  
         sb.Append(li.ToString());  
       }  
       ul.InnerHtml = sb.ToString();  
       return new HtmlString(ul.ToString());  
     }  
   }  
 }  
HomeController.cs
 using System;  
 using System.Collections.Generic;  
 using System.Linq;  
 using System.Web;  
 using System.Web.Mvc;  
 using MVCAlphabeticPager.Models;  
 namespace MVCAlphabeticPager.Controllers  
 {  
   public class HomeController : Controller  
   {  
     public ActionResult Index(string selectedLetter)  
     {  
       var model = new AlphabeticalPagingViewModel();  
       model.SelectedLetter = selectedLetter ;  
       using (var context = new AdventureWorks2012Entities())  
       {  
         model.FirstLetters = context.Products  
           .GroupBy(p => p.Name.Substring(0, 1))  
           .Select(x => x.Key.ToUpper())  
           .ToList();  
         //initialize model  
         model.Products = new List<ProductModel>();  
         if (string.IsNullOrEmpty(selectedLetter) || selectedLetter == "All")  
         {  
           model.Products  
             .AddRange(  
               (from item in context.Products  
                join category in context.ProductSubcategories  
                 on item.ProductSubcategoryID equals category.ProductSubcategoryID into ProductCategory  
                 from category in ProductCategory.DefaultIfEmpty()                       
                 select new ProductModel()   
                 {  
                   ProductName = item.Name,  
                   ProductID = item.ProductID,  
                   ProductNumber = item.ProductNumber,  
                   Color = (string.IsNullOrEmpty(item.Color)) ? "NA" : item.Color,  
                   StandardCost = item.StandardCost,  
                   ProductCategory = (string.IsNullOrEmpty(category.Name)) ? "NA" : category.Name  
                 }).ToList());   
         }  
         else  
         {  
           if (selectedLetter == "0-9")  
           {  
             var numbers = Enumerable.Range(0, 10).Select(i => i.ToString());  
             model.Products  
               .AddRange(  
                 (from item in context.Products  
                   .Where(item => numbers.Contains(item.Name.Substring(0, 1)))  
                 join category in context.ProductSubcategories  
                   on item.ProductSubcategoryID equals category.ProductSubcategoryID into ProductCategory  
                   from category in ProductCategory.DefaultIfEmpty()                
                 select new ProductModel()  
                 {  
                   ProductName = item.Name,  
                   ProductID = item.ProductID,  
                   ProductNumber = item.ProductNumber,  
                   Color = (string.IsNullOrEmpty(item.Color)) ? "NA" : item.Color,  
                   StandardCost = item.StandardCost,  
                   ProductCategory = (string.IsNullOrEmpty(category.Name)) ? "NA" : category.Name  
                 }).ToList());   
           }  
           else  
           {  
             model.Products  
               .AddRange(  
                 (from item in context.Products  
                   .Where(item => item.Name.Trim().StartsWith(selectedLetter))  
                 join category in context.ProductSubcategories  
                   on item.ProductSubcategoryID equals category.ProductSubcategoryID into ProductCategory  
                   from category in ProductCategory.DefaultIfEmpty()  
                 select new ProductModel()  
                 {  
                   ProductName = item.Name,  
                   ProductID = item.ProductID,  
                   ProductNumber = item.ProductNumber,  
                   Color = (string.IsNullOrEmpty(item.Color)) ? "NA" : item.Color,  
                   StandardCost = item.StandardCost,  
                   ProductCategory = (string.IsNullOrEmpty(category.Name)) ? "NA" : category.Name  
                 }).ToList());   
           }  
         }  
       }  
       return View(model);  
     }  
     public ActionResult About()  
     {  
       ViewBag.Message = "Your application description page.";  
       return View();  
     }  
     public ActionResult Contact()  
     {  
       ViewBag.Message = "Your contact page.";  
       return View();  
     }  
   }  
 }  
ProductModel.cs
  public class ProductModel  
   {  
     public int ProductID { get; set; }  
     public string ProductNumber { get; set; }  
     public string ProductName { get; set; }  
     public decimal StandardCost { get; set; }  
     public string Color { get; set; }  
     public string ProductCategory { get; set; }  
   }  
 }  
AlphabeticalPagingViewModel.cs
   public class AlphabeticalPagingViewModel  
   {  
     public List<ProductModel> Products { get; set; }      
     public List<string> FirstLetters { get; set; }  
     public string SelectedLetter { get; set; }      
   }  
Index.cshtml
 @model MVCAlphabeticPager.Models.AlphabeticalPagingViewModel   
 <br />  
 <div class="panel panel-primary">    
   <div class="panel-heading panel-head">Product Listing</div>  
   <div class="panel-body">      
     @Html.AlphabeticalPager(Model.SelectedLetter, Model.FirstLetters, x => Url.Action("Index", new { selectedLetter = x }))  
     <table class="table" style="margin: 4px">  
       <tr>  
         <th>  
           @Html.DisplayName("Product ID")  
         </th>  
         <th>  
           @Html.DisplayName("Product Number")  
         </th>  
         <th>  
           @Html.DisplayName("Product Name")  
         </th>  
         <th>  
           @Html.DisplayName("Standard Cost")  
         </th>  
         <th>  
           @Html.DisplayName("Color")  
         </th>  
         <th>  
           @Html.DisplayName("Category")  
         </th>  
       </tr>  
       @foreach (var item in Model.Products)  
       {  
         <tr>  
           <td>  
             @Html.DisplayFor(modelItem => item.ProductID)   
           </td>  
           <td>  
             @Html.DisplayFor(modelItem => item.ProductNumber)  
           </td>  
           <td>  
             @Html.DisplayFor(modelItem => item.ProductName)  
           </td>  
           <td>  
             @Html.DisplayFor(modelItem => item.StandardCost)  
           </td>  
           <td>  
             @Html.DisplayFor(modelItem => item.Color)  
           </td>  
           <td>  
             @Html.DisplayFor(modelItem => item.ProductCategory)  
           </td>  
         </tr>  
       }  
     </table>  
     @Html.AlphabeticalPager(Model.SelectedLetter, Model.FirstLetters, x => Url.Action("Index", new { selectedLetter = x }))  
   </div>  
 </div>  

Cheers! :)

Saturday, September 5, 2015

Alphabetical Paging in ASP.NET MVC (VB.NET)

   Here's a sample ASP.NET MVC 5 project using Alphabetical Paging concept of Mikesdotnetting. The revisions are made on the Model, User Interface, and the database used. I replaced Northwind db with Adventureworks.

Solution Structure Sample Output

The source code/files and instructions on how to create this project using Visual Studio 2013 are elaborated in VBForums code bank. Alphabetical Paging in ASP.NET MVC

Friday, September 4, 2015

Entity Framework join two tables if the foreign key is a nullable column

   When retrieving records by joining two tables wherein the foreign key of the referenced table is a nullable column, and you want to return all records from the primary table, with or without the matching rows in the right table, the query would be using left join rather than inner join.
So in LINQ expression, rather than join, revise the query to left join as presented below.

Show products with matching categories, disregarding other products without categories
MVC View: Code:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
model.Products
 .AddRange(
  (from item in context.Products
   .Where(item => item.Name.Trim().StartsWith(selectedLetter)) join category in context.ProductSubcategories on item.ProductSubcategoryID equals category.ProductSubcategoryID select new ProductModel() {
    ProductName = item.Name,
     ProductID = item.ProductID,
     ProductNumber = item.ProductNumber,
     Color = (string.IsNullOrEmpty(item.Color)) ? "NA" : item.Color,
     StandardCost = item.StandardCost,
     ProductCategory = (string.IsNullOrEmpty(category.Name)) ? "NA" : category.Name
   }).ToList());

Show products with or without Categories
Sql Server query using left join MVC View

Code:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
model.Products
 .AddRange(
  (from item in context.Products
   .Where(item => item.Name.Trim().StartsWith(selectedLetter)) join category in context.ProductSubcategories on item.ProductSubcategoryID equals category.ProductSubcategoryID into ProductCategory from category in ProductCategory.DefaultIfEmpty() select new ProductModel() {
    ProductName = item.Name,
     ProductID = item.ProductID,
     ProductNumber = item.ProductNumber,
     Color = (string.IsNullOrEmpty(item.Color)) ? "NA" : item.Color,
     StandardCost = item.StandardCost,
     ProductCategory = (string.IsNullOrEmpty(category.Name)) ? "NA" : category.Name
   }).ToList());

Thursday, September 3, 2015

ASP.NET Show Tooltip in Gridview Column

Here's how to show tooltip in an asp.net gridview column/cell on mouse hover. This option will set the Tooltip property of a particular gridview cell on RowDataBound event.

C# Code:
1
2
3
4
5
6
7
8
protected void grdCustomers_RowDataBound(object sender, GridViewRowEventArgs e)
{
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            string str = e.Row.Cells[1].Text;
            e.Row.Cells[1].ToolTip = str;
        }
}

Wednesday, September 2, 2015

Store update, insert, or delete statement affected an unexpected number of rows (0)

As I was creating a simple Create, Update, Delete (CRUD) application in ASP.NET MVC 5 and executing the controller on Edit, I encountered an error called "Store update, insert, or delete statement affected an unexpected number of rows (0)".
After debugging and looking at the stack trace, I found out that the value of the primary key is zero.
  Department: "Education"<br>  
   Designation: "Dean"<br>  
   EmployeeName: "JE"<br>  
   EmployeeID: 0<br>  
   Salary: 25500<br>  
The fix for this issue is to add a hidden field to the edit view referencing to the primary key which in this case is the EmployeeID.
 @Html.HiddenFor(model => model.EmployeeID)  
And now, the model passed to the context now has a value for the EmployeeID field.
  Department: "Education"<br>  
   Designation: "Dean"<br>  
   EmployeeName: "JE"<br>  
   EmployeeID: 2<br>  
   Salary: 25500<br>  
Cheers! :)