DataGridView没有显示正确的cultureinfo

时间:2016-04-04 11:44:44

标签: c# datagridview globalization

我有一个相当标准的BindingSource / DataGridView组合。 bindingSource具有十进制类型属性,必须在DataGridView中显示为货币。对于测试,我想看看如果我使用作为货币格式而不是£

的文化信息,它会是什么样子

我的问题是,尽管我以编程方式更改了当前线程的CurrentUICulture(我的应用程序只有一个线程),但我的DataGridView仍显示£

设计师为我创建了以下代码片段:

this.columnPriceValue = new Forms.DataGridViewTextBoxColumn();
this.columnPriceValue.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
this.columnPriceValue.DataPropertyName = "Value";
dataGridViewCellStyle2.Format = "C4";
...

在我的主窗体的构造函数中,我根据stackoverflow的回答How to change CurrentCulture at runtime?

将currentUICulture设置为荷兰文化
System.Threading.Thread.CurrentThread.CurrentUICulture =
    CultureInfo.GetCultureInfo(0x0013);

由于GBP符号仍然显示,我在将数据添加到bindingsource之前检查了currencySymbol:

public void ShowPrices(IEnumerable<Price> prices)
{
    string txt = System.Threading.Thread.CurrentThread.CurrentUICulture.NumberFormat.CurrencySymbol;
    Debug.WriteLine(txt);   
    this.bindingSource1.DataSource = prices;
    ...

调试器输出窗口显示仍然是货币符号,但DataGridview仍显示£

如何让它显示欧元符号?

2 个答案:

答案 0 :(得分:2)

设置Thread.CurrentThread.CurrentCulture,而不是Thread.CurrentThread.CurrentUICulture

虽然这些名称似乎暗示了不同的东西,但CurrentCulture实际上用于决定用于显示值的格式。

CurrentUICulture仅在您使用资源dll时有效,然后仅用于决定加载哪个资源dll。

另见What is the difference between CurrentCulture and CurrentUICulture properties of CultureInfo in .NET?

答案 1 :(得分:0)

修改

NineBerry在编辑时打败了我,但如上所述:只需使用以下内容:

Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(0x0013);

上一个答案

尝试使用CultureInfo

为特定列设置FormatProvider
this.columnPriceValue.DefaultCellStyle.FormatProvider = CultureInfo.GetCultureInfo(0x0013);

或者dataGridViewCellStyle2是价格列的单元格模板的样式:

dataGridViewCellStyle2.FormatProvider = CultureInfo.GetCultureInfo(0x0013);

或者更一般地说,在设置CurrentUICulture

之后
dataGridViewCellStyle2.FormatProvider = Thread.CurrentThread.CurrentUICulture;