views:

662

answers:

1

I'd like to change the pricing column on my DataGridView based upon currency a user selected currency ComboBox.

Currently, the price column is formatted to "C2". This defaults to look like "$1.00".

However, if my user were to switch the currency to be Great British Pound, I'd like to display the Great British Pound sign ("£") rather than a dollar sign ("$") so the end result would be £1.00.

Any suggestions on how to change the culture of a DataGridView?

Thanks in advance!

+1  A: 

You are looking for System.Globalization. There is A BUNCH of different options...

If you want to just change it for that specific element:

   //Label example but theory is the same
    [CultureInfo][2] ci = new CultureInfo("en-GB");
    double myMoney = 100.00;
    this.Label1.Text = myMoney.ToString("C2", ci);

If you would like to change it for everything then you can

     //Will format everything
     string strCulture = "en-GB";//Session["culture"].ToString();
     [CultureInfo][3] ci = new CultureInfo(strCulture);
     Thread.CurrentThread.[CurrentCulture][4] = ci ;
     Thread.CurrentThread.[CurrentUICulture][5] = ci;
     double myMoney = 100.00;
     this.Label1.Text = myMoney.ToString("C2");

In a DataGird if you are trying to format a databound row you will need to hook into the the onDataBound event and reformat that way, as I don't believe you can pass the argument as:DataFormatString = "{0:c,en-GB}

Something like so should do the trick(not tested)

  protected void gridView_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        //Define CultureInfo in page scope just put in example for reference
        [CultureInfo][6] ci = new CultureInfo("en-GB");
        if (e.Row.RowType == DataControlRowType.DataRow)
            ((Label)e.Row.FindControl("myMoney")).Text.ToString("C2", ci);
   }

OR

If you are Binding from a DataTable you can explicatlly set the DataTable Cultureinfo

CultureInfo ci = new CultureInfo("en-GB");
myTable.Locale = ci;

If you are looking for System wide cultural support(which I don't think you are but is worth mentioning) then you can look at using resource files

Simple example would be:

ResourceManager rm = ResourceManager.CreateFileBasedResourceManager("resource", "path to resouce files", null);
this.Label1.Text = rm.GetString("name");
cgreeno