在 DataGridView 中使用格式

问题描述

我的 DGV 有一些问题,DGV 受至少 30 列的数据表的限制(所有期望 PK 和 FK,都设置为字符串),现在有一个特定的列是我的产品成本想要像这样的示例:359.99 €,每次用户点击该列单元格时,它会显示 nullvalue 0.00 €,单元格内无法编辑货币符号,点分隔符也是如此。

这就是我的目标,我正在尝试做我在 windows 窗体中提到的所有事情,我已经通过代码尝试过,但是它没有做任何事情。最后我应该采取什么样的步骤来达到预期的结果?

我已经为该列尝试了以下代码,但是正如我之前所说,它什么也没做,虽然我在 StarkOverflow 中发现了一个类似的问题,但似乎我应该在绑定到 DGV 之前输入此代码(实际上我没有通过代码绑定它,我想我现在不需要它),但我认为这是不可能的,因为我需要绑定 DGV 以便我可以编辑它(还有一个未绑定的列,包含删除行按钮,但我认为这里不重要):

            advancedDataGridView1.Columns[14].DefaultCellStyle.Format = "c2";
            advancedDataGridView1.Columns[14].DefaultCellStyle.FormatProvider = CultureInfo.GetCultureInfo("fr-FR");

提前致谢。

解决方法

我不确定“为什么”您要将“COST”值存储为 string. Cost 表示数字 decimal 值,它“应该”存储在数据库中作为 decimal {1}} 或其他数值,但不是作为 string. 每次在数字上下文中使用 string 时,这都会产生更多的工作……就像您当前的情况一样。

此外,如果某些用户键入“Hello”作为“成本”值,这可能会使数据库处于不一致状态。有些东西闻起来有点腥味,这似乎实际上是在“制造”问题。

您是否出于某种原因将“成本”值保存为 string

将单元格格式设置为“c2”不会“当”列“type”是 string. 时执行任何操作

格式化时,单元格必须是正确的“类型”才能正确格式化。在这种情况下,decimal 类型适用于货币值。

另外,应该注意的是,如果您的代码“手动”将列添加到网格中,那么代码行......

dataGridView1.Columns[14].DefaultCellStyle.Format = "c2";
dataGridView1.Columns[14].DefaultCellStyle.FormatProvider = CultureInfo.GetCultureInfo("fr-FR");
 

...在添加这些列之前显然不起作用。

同样适用于使用 DataSource. 您首先添加 DataSource,然后代码格式化列。

同样,将 decimal 值作为 string. 存储到数据库中似乎很奇怪我做出这个假设是因为您的代码在技术上“可以”将 decimal 值转换为数据库到查询中的 string。如果是这种情况,那么一个简单的解决方法是更改​​查询以不将值转换为 string.

以下是上述内容的示例。该示例使用 DataTable 作为 DataSource. 它有两列,第一列是 decimal 类型,第二列是 string 类型。该表添加了一些行,以便每一行在每一列中都有“相同”的值。

enter image description here

在设置网格的 DataSource 后应用格式时,应该清楚的是,格式在 string 类型且应用于单元格的单元格上被“忽略” decimal 类型。

由于区域性信息设置为“fr-FR”,因此不使用“小数点”。因此,当用户输入数字时,用户需要在他们希望小数点所在的位置使用“逗号”。

对于完整示例,将 DataGridView 拖放到表单上并使用下面发布的代码来测试上述内容。我希望这是有道理的。

private void Form1_Load(object sender,EventArgs e) {
  dataGridView1.DataSource = GetTable();
  dataGridView1.Columns[0].DefaultCellStyle.Format = "c2";
  dataGridView1.Columns[0].DefaultCellStyle.FormatProvider = CultureInfo.GetCultureInfo("fr-FR");
  dataGridView1.Columns[1].DefaultCellStyle.Format = "c2";
  dataGridView1.Columns[1].DefaultCellStyle.FormatProvider = CultureInfo.GetCultureInfo("fr-FR");
}

private DataTable GetTable() {
  DataTable dt = new DataTable();
  dt.Columns.Add("Col0",typeof(decimal));
  dt.Columns.Add("Col1",typeof(string));
  dt.Rows.Add(12.345,12.345);
  dt.Rows.Add(1.35,1.35);
  dt.Rows.Add(112.555,112.555);
  dt.Rows.Add(12.333,12.333);
  return dt;
}

private void dataGridView1_DataError(object sender,DataGridViewDataErrorEventArgs e) {
  Debug.WriteLine("Error at Row: " + e.RowIndex + " Col: " + e.ColumnIndex);
  Debug.WriteLine("Error is:" + e.Exception.Message);
  Debug.WriteLine("Value is:" + dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].EditedFormattedValue);
}