Ошибка VB.NET DatagridViewCellValueChanged Windows 8

У меня есть эта проблема, которая выглядит очень странно, я разрабатываю программу, которая отправляет только сообщения об ошибках на компьютерах с Windows 8, но Windows 7 и Windows 10 работают отлично.

Я расскажу немного об ошибке в нескольких строках кода, особенно в случае DataGridViewCellValueChanged Я конвертирую число в формат монеты, но странно то, что событие запускается (по моему мнению), прежде чем они изменят значение ячейки, и я думаю, что событие cellvaluechanged должно быть выполнено, когда пользователь что-то набрал в ячейке, а затем этой ячейки, что-то "похожее" на CellEndEdit, но только при изменении значения ячейки, но в этом конкретном случае пользователь нажимает любой символ в любой ячейке в указанном столбце, не теряя фокус ячейки, и отправляет ошибку.

На моем компьютере с Windows 7 программа работает хорошо и на Windows 10 тоже

Это код:

Private Sub GridCatalogo_CellValueChanged(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles GridCatalogo.CellValueChanged
    If GridCatalogo.Columns(e.ColumnIndex).ToolTipText = "$" Then
        If IsNothing(GridCatalogo.Item(e.ColumnIndex, e.RowIndex).Value) = False Then
            Try
                GridCatalogo.Item(e.ColumnIndex, e.RowIndex).Value = Format(CType(GridCatalogo.Item(e.ColumnIndex, e.RowIndex).Value, Decimal), "$#,##0.00")
            Catch ex As Exception
                'MsgBox(ex.Message)
            End Try
        End If
    End If 
End Sub

Я знаю, что изображение сообщения об ошибке не нужно, но хотел показать данные, которые пользователь ввел в DataGridView.

В сообщении говорится:

Преобразование из строки "$8.00" в "Десятичное число" не поддерживается.

Как вы можете видеть в коде, мне пришлось обработать ошибку, чтобы прекратить отображать сообщение, поэтому только временно исправьте ошибку, но не понимаю, почему это происходит только в Windows 8

1 ответ

Этот код может помочь вам отладить. Ты хочешь s к моменту выполнения задания вы получите "8,00 долларов", и у вас не должно возникнуть никаких проблем. Если в сообщении об ошибке указано значение, которого вы не ожидали, но оно есть в таблице в какой-то момент после назначения, то вы знаете, что у вас есть проблема с синхронизацией.

Private Sub GridCatalogo_CellValueChanged(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles GridCatalogo.CellValueChanged
    If GridCatalogo.Columns(e.ColumnIndex).ToolTipText = "$" Then
        If IsNothing(GridCatalogo.Item(e.ColumnIndex, e.RowIndex).Value) = False Then
            Dim s As String = "not set"
            Dim d As Decimal = Decimal.MinValue
            Try
                s = GridCatalogo.Item(e.ColumnIndex, e.RowIndex).Value
                d = CType(s, Decimal)
                GridCatalogo.Item(e.ColumnIndex, e.RowIndex).Value = Format(d, "$#,##0.00")
            Catch ex As Exception
                MsgBox(String.Format("s={0}, d={1}, ex.message={2}", s, d, ex.Message))
            End Try
        End If
    End If
End Sub

Ваш метод форматирования, вероятно, работает, но почему бы не использовать формат валюты? Если CurrentCulture не работает, вы можете указать это.

Sub Main()
    Dim currencyString = "$8.00"

    Dim currencyOPFormat = Format(CType(currencyString, Decimal), "$#,##0.00")

    Dim currencyDecimal = Decimal.Parse(currencyString, Globalization.NumberStyles.Currency)
    Dim currencyNewFormat = currencyDecimal.ToString("C", CultureInfo.CurrentCulture)

    Console.WriteLine("Original: " & currencyOPFormat)

    Console.WriteLine("Parsed Decimal: " & currencyDecimal)
    Console.WriteLine("Formatted Decimal: " & currencyNewFormat)

    Console.ReadLine()
End Sub

См. О формате валюты: https://msdn.microsoft.com/en-us/library/dwhawy9k(v=vs.110).aspx

Другие вопросы по тегам