货币文化格式不应用于DataGridView列

本文关键字:DataGridView 应用于 文化 格式 货币 | 更新日期: 2023-09-27 17:49:39

我有2个DataGridViews (DGV),在这两个我有货币列,我想格式化。我正在写的代码似乎在其中一个中工作,但在另一个中不工作。

两个DGV都是这样设置的:首先将数据加载到DataTable中。然后BindingSource链接到这个数据表。最后,DGV使用这个BindingSource对象作为他们的数据。

我在表单的Load事件中使用以下代码来定制dgv的货币列:

dataGridView.Columns[columnIndexHere].DefaultCellStyle.FormatProvider = CultureInfo.GetCultureInfo("de-DE");
dataGridView.Columns[columnIndexHere].DefaultCellStyle.Format = String.Format("c")

似乎在一个DGV中格式化列,而不是另一个。此外,它不能工作的DGV,在它的父形式中甚至没有那么多的功能代码。我检查了代码,和DGV的属性,看看我是否在其他地方改变格式,但我没有发现任何东西。

两个DGV加载数据的方式之间唯一的细微区别是,对于第一个DGV的DataTable(其中格式化工作),数据是通过SELECT语句加载的(通过我自己的函数)…在第二个DGV的数据表(其中格式化不工作),我不从DB加载任何数据,而只是手动定义列(在数据表),因为在这种情况下,用户需要输入数据。

第二个DGV为什么不能格式化?


EDIT:添加更多信息:

为了演示这个问题,我创建了一个新的c# winforms项目,只添加了一个DataGridView,并将以下代码添加到Load事件中。即使对于这段代码,货币格式也没有完成:

DataTable dataTable = new DataTable();
dataTable.Columns.Add("ColA");
dataTable.Columns.Add("ColB");
dataTable.Columns.Add("ColC");

dataTable.Rows.Add("John", 832.293, "London");
dataTable.Rows.Add("Alice", 32972978.20489, "Atlanta");
dataTable.Rows.Add("Mark", 9184793284739, "Tokyo");
BindingSource bindingSource = new BindingSource();
bindingSource.DataSource = dataTable;
dataGridView1.DataSource = bindingSource;
var format = (NumberFormatInfo)NumberFormatInfo.CurrentInfo.Clone();
format.CurrencySymbol = "Mn. ";
dataGridView1.Columns["ColB"].DefaultCellStyle.FormatProvider = CultureInfo.GetCultureInfo("de-DE");
dataGridView1.Columns["ColB"].DefaultCellStyle.Format = String.Format("c");

货币文化格式不应用于DataGridView列

您不需要BindingSource来列出所有行,只需

dataGridView1.DataSource = dataTable

,因为你使用的是DataTable,删除这部分

dataGridView1.Columns .DefaultCellStyle"ColB"。

并尝试使用CellFormatting事件。

private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (e.ColumnIndex == 1) //Column ColB
            {
                if (e.Value != null)
                {
                    e.CellStyle.Format = "c";
                }
            }
        }

我希望这对你有帮助。

(前面问题的答案)

在定义两列后添加以下行,现在可以工作了:

qBDFrmDTForDisplay.Columns["Combined Price"].DataType = Type.GetType("System.Decimal");