2

我有 2 个 DataGridViews (DGV),并且在这两个中我都有要格式化的货币列。我正在编写的代码似乎可以在一个中工作,但不能在另一个中工作。

两个 DGV 都是这样设置的:首先将数据加载到 DataTable 中。然后一个 BindingSource 链接到这个 DataTable。最后,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 的 DataTable 中(对于哪种格式不起作用),我不从 DB 加载任何数据,而是手动定义列(在 DataTable 中),因为在这种情况下,用户需要输入数据..

任何线索为什么格式化在第二个 DGV 上不起作用?


编辑:添加更多信息:

为了演示该问题,我创建了一个新的 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");

希望这有助于更多地诊断问题..

4

2 回答 2

2

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

dataGridView1.DataSource = dataTable,

并且由于您使用的是DataTable,请删除此部分

dataGridView1.Columns["ColB"].DefaultCellStyle.Format = String.Format("c");

并尝试使用该CellFormatting事件。

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

我希望它会有所帮助:)

于 2012-12-25T13:45:31.163 回答
1

(以前从问题中回答)

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

qBDFrmDTForDisplay.Columns["Combined Price"].DataType = Type.GetType("System.Decimal");
于 2018-05-24T14:57:02.240 回答