在 DataGridView 中使用格式
Using format in 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
或其他数值,但不是 string.
每次在数字上下文中使用 string
时都会产生更多的工作……就像您当前的情况一样。
此外,如果某些用户键入“Hello”作为“成本”值,这可能会使数据库处于不一致状态。有些东西闻起来有腥味,这似乎实际上是在“制造”问题。
您将“成本”值保存为 string
是出于某种原因吗?
将单元格格式设置为“c2”不会在“当”列“类型”为 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
类型。 table 添加了一些行,使得每一行在每一列中都有“相同”的值。
在设置网格的 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);
}
我的 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
或其他数值,但不是 string.
每次在数字上下文中使用 string
时都会产生更多的工作……就像您当前的情况一样。
此外,如果某些用户键入“Hello”作为“成本”值,这可能会使数据库处于不一致状态。有些东西闻起来有腥味,这似乎实际上是在“制造”问题。
您将“成本”值保存为 string
是出于某种原因吗?
将单元格格式设置为“c2”不会在“当”列“类型”为 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
类型。 table 添加了一些行,使得每一行在每一列中都有“相同”的值。
在设置网格的 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);
}