Search code examples
asp.netdatagridviewsettingsculture

Programatically changing the culture of a DataGridView?


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!


Solution

  • 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");