Как изменить формат из DataTable и показать в DataGridView в vb.net

Как изменить формат DataTable и Show в DataGridView в vb.net? Я хочу изменить формат DataTable без использования формата DataGridView и отображения в DataGriView. Пожалуйста, порекомендуйте лучшее решение. Я пробовал, но результат все равно в datagridview не изменился, как я прикрепил на скриншоте ниже.

Спасибо

        Dim dt As New DataTable("tbl")
        Dim dtColumn As DataColumn
        dtColumn = New DataColumn()
        dtColumn.DataType = GetType(DateTime)
        dtColumn.ColumnName = "CreatedDate"
        dt.Columns.Add(dtColumn)
        Dim dr As DataRow = dt.NewRow()
        dr("CreatedDate") = DateTime.Now
        Dim dr1 As DataRow = dt.NewRow()
        dr1("CreatedDate") = DateTime.Now.AddDays(1)
        dt.Rows.Add(dr)
        dt.Rows.Add(dr1)
Dim query = dt.AsEnumerable().Select(Function(r) r.Field(Of DateTime)("CreatedDate").ToString("yyyy/MM/dd"))
DataGridView1.DataSource = dt
'if I run the console then the output results change this should be possible without formatting the datagridview
        'For Each r In query
        '    Console.WriteLine(r.ToString())
        '    Console.WriteLine("Press any key to continue")
        '    Console.ReadKey()

        'Next r

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
86
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете удалить .ToString("yyyy/MM/dd").

В конструкторе форм выберите DataGridView и перейдите к событиям. Добавьте обработчик событий для ColumnAdded.

Это сгенерирует следующий код:

Private Sub DataGridView1_ColumnAdded(sender As Object, e As DataGridViewColumnEventArgs) Handles dataGridView1.ColumnAdded

End Sub

Теперь вы можете определить, что должен делать обработчик событий всякий раз, когда столбцы добавляются в ваш datagridview, поэтому:

Private Sub DataGridView1_ColumnAdded(sender As Object, e As DataGridViewColumnEventArgs) Handles dataGridView1.ColumnAdded

    ' Cast the argument to DataGridViewTextBoxColumn
    Dim c As DataGridViewTextBoxColumn = TryCast(e.Column, DataGridViewTextBoxColumn)

    ' Test if conversion has been successful
    If c IsNot Nothing Then

        Select Case c.ValueType

            Case GetType(Date) ' If ValueType of column being added is Date

                Dim cellStype As New DataGridViewCellStyle With {.Format = "dd/MM/yyyy"} ' Set here the format for this DataGridViewTextBoxColumn
                c.DefaultCellStyle = cellStype ' Apply the style

                ' Add here other ValueType you want to format differently, if any

        End Select

    End If

End Sub

Обратите внимание, что вы можете определить формат для других ValueType, просто добавив соответствующий регистр в тот же обработчик событий.

Результат:

Я настоятельно рекомендую вам включить Option Strict On для ваших проектов VB.Net. Подробнее об этом можно прочитать здесь.

--- Обновлять ---

Согласно вашему комментарию, вам действительно нужно просто изменить тип DateTime (Date) на DateOnly.

Вот ваш код обновлен соответственно, обратите внимание, что я упростил инициализацию объекта и изменил способ обращения к указанному DataColumn - если вы можете, предпочтительнее использовать сам объект DataColumn вместо его имени (строка).

Private Sub ImprovedCode()

    Dim dt As New DataTable("tbl")

    ' Change DateTime to DateOnly
    Dim dtColumn As New DataColumn With {.DataType = GetType(DateOnly), .ColumnName = "CreatedDate"}
    dt.Columns.Add(dtColumn)

    Dim dr As DataRow = dt.NewRow()
    dr(dtColumn) = DateOnly.FromDateTime(Date.Now) ' This is instead of dr("CreatedDate")

    Dim dr1 As DataRow = dt.NewRow()
    dr1(dtColumn) = DateOnly.FromDateTime(Date.Now) ' This is instead of dr("CreatedDate")
    dt.Rows.Add(dr)
    dt.Rows.Add(dr1)
    dataGridView1.DataSource = dt

End Sub

Результат визуализатора Visual Studio DataTable:

Обратите внимание: DateOnly и TimeOnly доступны только в .Net 6 и выше — если ваш проект ориентирован на .Net Framework, вы не можете использовать эти типы. Кстати, если ваш проект нацелен на .Net Framework, я предлагаю вам прочитать этот ответ на SO о том, какую версию .Net выбрать.

Обновление. Как прокомментировал ниже владелец вопроса, есть библиотека, которая включает DateOnly в неподдерживаемых фреймворках: Portable.System.DateTimeOnly

Спасибо за ваш ответ. если я запускаю консоль, то результаты вывода меняются, это должно быть возможно без форматирования представления данных.

And 12.01.2023 03:55

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

IFrank 12.01.2023 07:56
So directly formatting the DataTable itself? да, я хочу напрямую форматировать данные и отображать их в datagridview. как этот код Dim query = dt.AsEnumerable().Select(Function(r) r.Field(Of DateTime)("CreatedDate").ToString("yyyy/MM/dd")) как код выше я отображаю в консоли
And 12.01.2023 08:05

@ И я обновил свой ответ в соответствии с вашими потребностями. Пожалуйста, дайте мне знать, если это решит вашу проблему.

IFrank 12.01.2023 10:45

спасибо за ответ, но мой проект нацелен на .Net Framework

And 12.01.2023 15:14

Извините, но я не понимаю вашего вопроса сейчас. Вы сказали, что вам нужно отформатировать эту таблицу данных, чтобы показать ее в DataGridView, поэтому я предложил метод DataGridView_ColumnAdded. Если вам нужно загрузить DataTable в DataGridView, зачем вам форматировать его напрямую? Учтите, что, поскольку вы используете «классическую» Net Framework, вы объявляете переменные как Date, но это короткое имя для DateTime — как следует из названия, этот тип данных всегда будет содержать дату и время, независимо от того, объявите ли вы время или нет. Вы пробовали предложенное мной решение с форматированием DataGridView?

IFrank 13.01.2023 11:08

сначала с последним ответом вы предоставили решение с сетевой структурой, но должны использовать библиотеку Portable.System.DateTimeOnly, чтобы она могла использовать «только дату». во-вторых, почему я не форматировал datagridview, потому что я использовал библиотеку отчетов, а именно Kimtoo.Reports 1.0.0 в формате добавления datagridview, тогда результаты были неподходящими, и поэтому я сделал решение для добавления данных. л

And 13.01.2023 13:54

если я делаю решение формата datagridview, то результаты выходного отчета по-прежнему используют дату и время, тогда как если я использую dateonly, то результаты выходного отчета являются подходящими. ссылка. Вот что это значит, может быть, вы можете мне помочь

And 13.01.2023 13:56

@ И +1 за цитирование этой библиотеки, я этого не знал, и, возможно, это может быть кому-то полезно - я обновляю свой ответ. Итак, DateOnly полностью решил вашу проблему или есть что-то еще, с чем я могу помочь?

IFrank 13.01.2023 17:29
ссылка ,у меня новый пост почти такой же как и этот пост только форматы другие может вы мне поможете
And 14.01.2023 03:51

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