How
to apply multiple Cultures on salary column in Asp.net GridView
Note: Here we have discuss multiple cultures for the
single page for example each row of GridView display a record for the person
belonging to different Country
Use the code belowto get the list of all supported cultures
in Asp.net
// using this namespace
using System.Globalization;
protected void
Button1_Click(object sender, EventArgs e)
{
string ss = "<table><tr
><th style='width:150px'>Country Name</th><th
style='width:150px'>CulturName</th>";
foreach (CultureInfo
ci in CultureInfo.GetCultures(CultureTypes.AllCultures))
{
ss += "<tr><td>" + ci.Name + "</td><td>" + ci.DisplayName
+ "<td><tr>";
}
ss += "</table>";
Literal1.Text
= ss;
}
Result
RowDataBound Event : It is raised when a record in the datasource is
bound to a row in GridView Control
use test
create table Employee
(
EmpId int primary key,
Name varchar(50),
Salary int,
CountryName varchar(50)
)
Source Code for Default.aspx…………………………..
<%@ Page Language="C#"
AutoEventWireup="true"
CodeFile="Default2.aspx.cs"
Inherits="Default2"
%>
<!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>
<asp:GridView ID="GridView1"
runat="server"
AutoGenerateColumns="False"
DataKeyNames="EmpId" DataSourceID="SqlDataSource1"
onrowdatabound="GridView1_RowDataBound">
<Columns>
<asp:BoundField DataField="EmpId"
HeaderText="EmpId"
ReadOnly="True"
SortExpression="EmpId" />
<asp:BoundField DataField="Name"
HeaderText="Name"
SortExpression="Name"
/>
<asp:BoundField DataField="Salary"
HeaderText="Salary"
DataFormatString="{0:c}"
SortExpression="Salary" />
<asp:BoundField DataField="CountryName"
HeaderText="CountryName"
SortExpression="CountryName" />
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1"
runat="server"
ConnectionString="<%$ ConnectionStrings:testConnectionString %>"
SelectCommand="SELECT * FROM [Employee] ORDER
BY [EmpId]">
</asp:SqlDataSource>
</div>
</form>
</body>
</html>
Source Code for
Default.aspx.cs…………………………..
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Default2 :
System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs
e)
{
}
// code with RowDataBound Event........................
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs
e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
if (e.Row.Cells[3].Text == "US")
{
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-Us");
}
else if (e.Row.Cells[3].Text == "India")
{
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-IN");
}
else if
(e.Row.Cells[3].Text == "South Africa")
{
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-ZA");
}
else if
(e.Row.Cells[3].Text == "Malaysia")
{
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-MY");
}
else if
(e.Row.Cells[3].Text == "UK")
{
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-GB");
}
}
}
}
Result: Here this row is
also process with the current default Culture US ("en-Us")
Because we are
setting the thread culture for the next row basically
Note: for the above
error, solution is given below
protected void
GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
if (e.Row.Cells[3].Text == "US")
{
//System.Threading.Thread.CurrentThread.CurrentCulture = new
System.Globalization.CultureInfo("en-Us");
int salary = Convert.ToInt32(e.Row.Cells[2].Text);
string formattedstr = string.Format(new System.Globalization.CultureInfo("en-Us"), "{0:c}",
salary);
e.Row.Cells[2].Text
= formattedstr;
}
else if
(e.Row.Cells[3].Text == "India")
{
int salary = Convert.ToInt32(e.Row.Cells[2].Text);
string formattedstr = string.Format(new System.Globalization.CultureInfo("en-IN"), "{0:c}",
salary);
e.Row.Cells[2].Text
= formattedstr;
}
else if
(e.Row.Cells[3].Text == "South Africa")
{
int salary = Convert.ToInt32(e.Row.Cells[2].Text);
string formattedstr = string.Format(new System.Globalization.CultureInfo("en-ZA"), "{0:c}",
salary);
e.Row.Cells[2].Text
= formattedstr;
}
else if
(e.Row.Cells[3].Text == "Malaysia")
{
int salary = Convert.ToInt32(e.Row.Cells[2].Text);
string formattedstr = string.Format(new System.Globalization.CultureInfo("en-MY"), "{0:c}",
salary);
e.Row.Cells[2].Text
= formattedstr;
}
else if (e.Row.Cells[3].Text
== "UK")
{
int salary = Convert.ToInt32(e.Row.Cells[2].Text);
string formattedstr = string.Format(new System.Globalization.CultureInfo("en-GB"), "{0:c}",
salary);
e.Row.Cells[2].Text
= formattedstr;
}
}
Then the following
error is coming up
Server
Error in '/GridViewConcept' Application
Input string was not in a correct
format.
Description: An unhandled exception occurred
during the execution of the current web request. Please review the stack trace
for more information about the error and where it originated in the code.
Exception Details: System.FormatException: Input string was not in a correct format.
Source Error:
Exception Details: System.FormatException: Input string was not in a correct format.
Source Error:
Line 53:
else if (e.Row.Cells[3].Text == "India")
Line 54:
{
Line 55: int salary =
Convert.ToInt32(e.Row.Cells[2].Text);
Line 56:
string formattedstr = string.Format(new
System.Globalization.CultureInfo("en-IN"), "{0:c}",
salary);
Line 57:
e.Row.Cells[2].Text = formattedstr;
|
For removing the above error we will
go to the GridView source of the default page and remove the DataFormatString="{0:c}" from grid view bound field because it is a render with
salary symbol hence it cannot be converted into integer property
For Example:
<asp:BoundField DataField="Salary"
HeaderText="Salary" DataFormatString="{0:c}"
SortExpression="Salary" />
Result:
0 comments:
Post a Comment