Как изменить 6-значный номер в строку даты - PullRequest
0 голосов
/ 29 июня 2018

Итак, я нашел эту ветку, которая точно говорит о моей проблеме, однако решение не работает для меня: Как изменить столбец Формат в Datagridview на тип даты для этого значения

У меня есть другой шаблон номера, в котором мои данные: ГГММДД, всего 6 цифр (000901 - 1 сентября 2000 г.)

Имеет ли структура данных разницу при преобразовании ее в строку данных? Должен ли он быть в исходном формате?

Это моя текущая строка кода:

DataGridView1.Columns(1).DefaultCellStyle.Format = "yy/MM/dd"

Просто пытаюсь получить какой-либо формат, какой бы он ни был, но он просто остается шестизначным.

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

Я взял вашу шестизначную строку и преобразовал ее в DateTime, затем отформатировал так, как вы хотели.

Dim strDate As String = "180211"
Dim myDate As New DateTime(CInt("20" & strDate.Substring(0, 2)), CInt(strDate.Substring(2, 2)), CInt(strDate.Substring(4)))
Debug.Print(myDate.ToString("yy/MM/dd"))

EDIT: Я нашел лучший ответ благодаря user1751825 на VB.NET сравнить дату и время в строковом формате

Dim myDate As Date = DateTime.ParseExact(strDate, "yyMMdd", CultureInfo.InvariantCulture)
0 голосов
/ 29 июня 2018

ОК, попробуйте это. Установите формат в представлении данных в формате даты, который вы хотите использовать. Для моего примера у меня было 3 столбца, а крайний правый столбец содержал 6-значные строки.

enter image description here

В моей 3-й колонке я установил формат yyyy / MM / dd в представлении данных.

При нажатии кнопки я перебрал dgv и проанализировал значения до даты и времени, что позволило формату работать так, как он теперь работает с типом даты.

    For Each r As DataGridViewRow In DataGridView1.Rows
        If Not r.IsNewRow Then
            r.Cells(2).Value = DateTime.ParseExact(r.Cells(2).Value.ToString, "yyMMdd", CultureInfo.InvariantCulture)
        End If
    Next

После нажатия на кнопку я получил следующие результаты.

enter image description here

Теперь, когда столбец является типом данных даты, мы можем просто изменить формат и формат столбцов на новый формат.

Я добавил вторую кнопку, и в эту кнопку я поместил код

DataGridView1.Columns(2).DefaultCellStyle.Format = "MMM dd, yyyy"

, которые немедленно изменяют 3-й столбец на новый формат

enter image description here

0 голосов
/ 29 июня 2018

Подумав и поэкспериментировав, я понял, как сделать это в графическом интерфейсе вместо загрузки данных. Вы можете добиться этого конкретного форматирования, обрабатывая событие CellFormatting для DataGridView.

Данные испытаний, которые я использовал:

Private Property MyData As DataTable

Private Sub InitialiseData()
    MyData = New DataTable
    MyData.Columns.Add("YMDString", GetType(String))

    Dim dr As DataRow

    dr = MyData.NewRow()
    dr(0) = "000901"
    MyData.Rows.Add(dr)

    dr = MyData.NewRow()
    dr(0) = "010901"
    MyData.Rows.Add(dr)

    dr = MyData.NewRow()
    dr(0) = "020901"
    MyData.Rows.Add(dr)
End Sub

Конфигурация DataGridView

Private Sub SetupDataGridView()
    InitialiseData()
    DataGridView1.AutoGenerateColumns = False
    DataGridView1.Columns.Add("YMDString", "YMD String")
    DataGridView1.Columns.Add("YMDDateTime", "YMD DateTime")
    DataGridView1.Columns(0).DataPropertyName = "YMDString"
    DataGridView1.Columns(1).DataPropertyName = "YMDString"
    DataGridView1.DataSource = MyData

    AddHandler DataGridView1.CellFormatting, AddressOf DataGridView1OnCellFormatting
End Sub

И обработчик событий CellFormatting, который выполняет тяжелую работу. Разбор DateTime - не лучшее, что вы можете использовать, но он иллюстрирует принцип того, чего вы хотите достичь.

Private Sub DataGridView1OnCellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs)
    Dim thisGrid As DataGridView = CType(sender, DataGridView)

    If (thisGrid IsNot Nothing AndAlso e.Value IsNot Nothing) Then
        If (thisGrid.Columns(e.ColumnIndex).Name = "YMDDateTime") Then
            Dim stringValue As String = e.Value.ToString()
            Dim year As Integer = 2000 + stringValue.Substring(0, 2)
            Dim month As Integer = stringValue.Substring(2, 2)
            Dim day As Integer = stringValue.Substring(4, 2)

            Dim dt As New DateTime(year, month, day)

            e.Value = dt.ToString("yyyy/MM/dd")
        End If
    End If
End Sub

При запуске я получаю такой результат:

When run, I get this result:

...