0

我正在努力寻找这个问题的具体答案,因此我自己问...

我有一个 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

TextBox 中的文本正确显示为货币,但是当执行将其放入 DGV 中的单元格的代码时,它会失败,说该值的格式不正确。

DGV.Columns(3).DefaultCellStyle.Format = "C2"格式不同吗FormatCurrency(TextBox.Text)

4

1 回答 1

2

那都是错的。“C2”是一个数字格式字符串,所以它只适用于数字。包含String数字字符不是数字,String包含货币文本绝对不是。您需要StringTextBox, Concert 中获取一个数字(可能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)
于 2021-09-02T08:39:03.800 回答