Как изменить формат 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
Вы можете удалить .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
Вы хотите отформатировать DataTable, даже если он не отображается в DataGridView? Итак, непосредственное форматирование самой DataTable? Пожалуйста, подтвердите, что я правильно понял, чтобы я мог обновить свой ответ.
So directly formatting the DataTable itself?
да, я хочу напрямую форматировать данные и отображать их в datagridview. как этот код Dim query = dt.AsEnumerable().Select(Function(r) r.Field(Of DateTime)("CreatedDate").ToString("yyyy/MM/dd"))
как код выше я отображаю в консоли
@ И я обновил свой ответ в соответствии с вашими потребностями. Пожалуйста, дайте мне знать, если это решит вашу проблему.
спасибо за ответ, но мой проект нацелен на .Net Framework
Извините, но я не понимаю вашего вопроса сейчас. Вы сказали, что вам нужно отформатировать эту таблицу данных, чтобы показать ее в DataGridView, поэтому я предложил метод DataGridView_ColumnAdded. Если вам нужно загрузить DataTable в DataGridView, зачем вам форматировать его напрямую? Учтите, что, поскольку вы используете «классическую» Net Framework, вы объявляете переменные как Date, но это короткое имя для DateTime — как следует из названия, этот тип данных всегда будет содержать дату и время, независимо от того, объявите ли вы время или нет. Вы пробовали предложенное мной решение с форматированием DataGridView?
сначала с последним ответом вы предоставили решение с сетевой структурой, но должны использовать библиотеку Portable.System.DateTimeOnly, чтобы она могла использовать «только дату». во-вторых, почему я не форматировал datagridview, потому что я использовал библиотеку отчетов, а именно Kimtoo.Reports 1.0.0 в формате добавления datagridview, тогда результаты были неподходящими, и поэтому я сделал решение для добавления данных. л
если я делаю решение формата datagridview, то результаты выходного отчета по-прежнему используют дату и время, тогда как если я использую dateonly, то результаты выходного отчета являются подходящими. ссылка. Вот что это значит, может быть, вы можете мне помочь
@ И +1 за цитирование этой библиотеки, я этого не знал, и, возможно, это может быть кому-то полезно - я обновляю свой ответ. Итак, DateOnly полностью решил вашу проблему или есть что-то еще, с чем я могу помочь?
Спасибо за ваш ответ. если я запускаю консоль, то результаты вывода меняются, это должно быть возможно без форматирования представления данных.