转换为并仅在 datagridview 的特定列中显示整数
Convert to and only display integers in specific column of datagridview
我在 datagridview 中有一列应该转换为并仅显示整数值(即没有小数点)。我将 DefaultCellStyle.Format 设置为 "F0"。如图所示,我在 dgv_CellFormatting 处理程序中处理这些格式检查。
private void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
// if it's first row or first column, display integer, no decimals
if ((e.ColumnIndex > 0 && e.RowIndex == 0) || (e.ColumnIndex == 0 && e.RowIndex > 0))
{
double tempVal = Double.Parse(e.Value.ToString());
string tempStr = System.Math.Round(tempVal).ToString("F0");
e.Value = tempStr;
}
}
我为该列中的每个单元格设置了初始值。如果我将格式保留为 "F0",这些初始值将显示为整数(这很好)。如果我将格式更改为 "F1",它会显示带一位小数的值(添加 .0)。这是有道理的。
但是,当我将格式设置为 "F0" 并单击以编辑单元格并输入“1.0”或“1.00”时,它不会将格式更正回“1”。当格式设置为 "F1" 并且我输入“5”时,它会更正它并正确显示“5.0”。但如果我输入“5.00”,它会显示“5.00”并且不会更正回“5.0”。它似乎只在需要尾随零加法而不是减法时更正格式。
更奇怪的是,如果我尝试使用以下方法捕获 "x.00" 的条目:
if (tempStr.EndsWith(".00")) tempStr.Substring(0, tempStr.Length-3);
它甚至没有捕捉到 "x.00" 的条目,但仍然在 datagridview 单元格中显示 "x.00"。
如何强制在用户输入时只显示没有小数的整数?
呃发现了我的问题(实际上是两个)。在其他一些格式检查代码中,我使用了一种错误的方法来检查以确保输入是数字以避免解析非数字字符。
// don't format upper leftmost cell
// don't try to format a null or blank cell
// don't try to format unless it's a valid number
if (e.RowIndex < 0 || e.ColumnIndex < 0 || e.Value == null || e.Value == DBNull.Value ||
String.IsNullOrWhiteSpace(e.Value.ToString()) || !e.Value.ToString().All(char.IsDigit))
{
return;
}
空头支票是:e.Value.ToString().All(char.IsDigit)。好吧,当我在 datagridview 中输入带小数点的数字时,“.”不是数字,因此函数 returns 在格式化和应用值之前。
第二个问题是,90%的情况下,我测试时手飞到的数字是“1.0”,期望格式化显示“1”。嗯,我把整个table的NullValue设置为1.0,然后根据需要修改第一个row/col的正常值。当用户(我)输入“1.0”时,它被认为是 null 并且未通过 if (e.Value == null) 检查。因此,格式化操作被跳过。基本上我将 "NullValue" 属性 与初始单元格值混淆了。
短篇小说
此代码有效:
double tempVal = Double.Parse(e.Value.ToString());
string tempStr = System.Math.Round(tempVal).ToString("F0");
e.Value = tempStr;
我在 datagridview 中有一列应该转换为并仅显示整数值(即没有小数点)。我将 DefaultCellStyle.Format 设置为 "F0"。如图所示,我在 dgv_CellFormatting 处理程序中处理这些格式检查。
private void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
// if it's first row or first column, display integer, no decimals
if ((e.ColumnIndex > 0 && e.RowIndex == 0) || (e.ColumnIndex == 0 && e.RowIndex > 0))
{
double tempVal = Double.Parse(e.Value.ToString());
string tempStr = System.Math.Round(tempVal).ToString("F0");
e.Value = tempStr;
}
}
我为该列中的每个单元格设置了初始值。如果我将格式保留为 "F0",这些初始值将显示为整数(这很好)。如果我将格式更改为 "F1",它会显示带一位小数的值(添加 .0)。这是有道理的。
但是,当我将格式设置为 "F0" 并单击以编辑单元格并输入“1.0”或“1.00”时,它不会将格式更正回“1”。当格式设置为 "F1" 并且我输入“5”时,它会更正它并正确显示“5.0”。但如果我输入“5.00”,它会显示“5.00”并且不会更正回“5.0”。它似乎只在需要尾随零加法而不是减法时更正格式。
更奇怪的是,如果我尝试使用以下方法捕获 "x.00" 的条目:
if (tempStr.EndsWith(".00")) tempStr.Substring(0, tempStr.Length-3);
它甚至没有捕捉到 "x.00" 的条目,但仍然在 datagridview 单元格中显示 "x.00"。
如何强制在用户输入时只显示没有小数的整数?
呃发现了我的问题(实际上是两个)。在其他一些格式检查代码中,我使用了一种错误的方法来检查以确保输入是数字以避免解析非数字字符。
// don't format upper leftmost cell
// don't try to format a null or blank cell
// don't try to format unless it's a valid number
if (e.RowIndex < 0 || e.ColumnIndex < 0 || e.Value == null || e.Value == DBNull.Value ||
String.IsNullOrWhiteSpace(e.Value.ToString()) || !e.Value.ToString().All(char.IsDigit))
{
return;
}
空头支票是:e.Value.ToString().All(char.IsDigit)。好吧,当我在 datagridview 中输入带小数点的数字时,“.”不是数字,因此函数 returns 在格式化和应用值之前。
第二个问题是,90%的情况下,我测试时手飞到的数字是“1.0”,期望格式化显示“1”。嗯,我把整个table的NullValue设置为1.0,然后根据需要修改第一个row/col的正常值。当用户(我)输入“1.0”时,它被认为是 null 并且未通过 if (e.Value == null) 检查。因此,格式化操作被跳过。基本上我将 "NullValue" 属性 与初始单元格值混淆了。
短篇小说
此代码有效:
double tempVal = Double.Parse(e.Value.ToString());
string tempStr = System.Math.Round(tempVal).ToString("F0");
e.Value = tempStr;