我正在努力寻找这个问题的具体答案,因此我自己问了一下…
我有一个DataGridView与列有以下格式应用到它:
DGV.Columns(3).DefaultCellStyle.Format = "C2"
在表单上有一个文本框,用户在其中输入一个数字,然后将该值输入到DGV中的一个单元格中:
For Each dr As DataGridViewRow In DGV.Rows
dr.Cells("ColumnHeader").Value = TextBox.Text
Next
在执行上述代码之前,在TextBox上发生此事件以格式化其值:
Private Sub TextBox_Leave(sender As Object, e As EventArgs) Handles TextBox.Leave
TextBox.Text = FormatCurrency(TextBox.Text)
End Sub
文本框内的文本作为货币正确显示,但是当代码将其放入DGV的单元格中执行时,它失败了,说值的格式不正确。
DGV.Columns(3).DefaultCellStyle.Format = "C2"
和FormatCurrency(TextBox.Text)
格式不同吗?
这都是错的。"C2"是一个数字格式字符串,因此它只对数字有效。包含数字字符的String
不是数字,包含货币文本的String
绝对不是数字。您需要从TextBox
中获取String
,将其与一个数字(可能是货币值的Decimal
)协调,然后将该数字加载到网格中。网格将该数字以及所有数据转换为要显示的文本,并将使用格式字符串:
dr.Cells("ColumnHeader").Value = CDec(TextBox.Text)
至此,您可能已经验证了用户输入,因此不存在CDec
抛出异常的可能性。
如果目的是在网格和TextBox
中显示格式化为货币的数据,那么您应该摆脱Leave
事件处理程序,而处理Validating
和Validated
事件。第一个将验证输入以确保它是数字,第二个将执行格式化:
Private Sub TextBox1_Validating(sender As Object, e As CancelEventArgs) Handles TextBox1.Validating
If Not Decimal.TryParse(TextBox1.Text, NumberStyles.Currency, Nothing, Nothing) Then
'Don't let the control lose focus when it contains invalid data.
e.Cancel = True
End If
End Sub
Private Sub TextBox1_Validated(sender As Object, e As EventArgs) Handles TextBox1.Validated
TextBox1.Text = Decimal.Parse(TextBox1.Text, NumberStyles.Currency).ToString("C2")
End Sub
该代码将允许用户输入货币符号或不输入货币符号,但一旦失去焦点,它将确保格式是带有两个小数点的货币。然后,您需要在复制到网格时允许格式化:
dr.Cells("ColumnHeader").Value = Decimal.Parse(TextBox1.Text, NumberStyles.Currency)