Формат даты в текстовом поле

#vb.net

#vb.net

Вопрос:

Мне действительно нужна помощь, я сохраняю запись в поле Product_Date как тип Text в моем доступе к таблице. Иногда я сохраняю запись даты Product_Date только в год, например, так (2007) Или (1995) Или (2019)… С помощью моего кода я попытался сделать так, чтобы дата, когда я нажимаю dataGridView1, отображалась в текстовом поле 3 следующим образом: dd-MM-yyyy . Это работает очень хорошо, но проблема, когда я добираюсь до строки, зарегистрированной только с годом, я получаю это сообщение об ошибке:

 Convertion from string "2007" to type "date" is not valid
 

Как это сделать, чтобы избежать этого сообщения об ошибке?
Мой код :

  Private Sub DataGridView1_Click(sender As Object, e As EventArgs) Handles DataGridView1.Click
    Try
        With DataGridView1.CurrentRow
            TextBox1.Text = .Cells("Product_Id").Value.ToString()
            TextBox2.Text = .Cells("Product_Nom").Value.ToString()
            TextBox3.Text = .Cells("Product_Date").Value.ToString()
            TextBox3.Text = Format(CDate(Convert.ToString(TextBox3.Text)), "dd-MM-yyyy")

        End With
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End Sub
 

Комментарии:

1. Мое предложение: переосмыслите свою структуру данных и используйте формат даты / времени для дат. Если вы хотите представить только год, вы можете сделать это, используя годовую часть даты. Если вам Year по какой-то причине нужна просто ссылка, добавьте поле, в котором хранится только год (подойдет числовое значение). Но вам это не нужно. SQL в любом случае позволяет фильтровать год из поля даты и времени. В любом случае, если вам нужно хранить даты, используйте соответствующий тип данных, а затем представьте дату в предпочтительном формате пользовательского интерфейса.

2. Большое вам спасибо, Джими.как можно получить и сохранить только год в поле access: DateTime

3. Dim myDate As Date = New Date(2019, 1, 1) => сохраните дату. Когда вы прочитаете его обратно, это зависит от того, из чего вы его прочитали. Предполагая, что вы считываете поле непосредственно из таблицы данных, а поле даты / времени находится в Column(0) : Dim myYear As Integer = DirectCast(myTable.Rows(0)(0), Date).Year

Ответ №1:

Что вы можете попробовать, так это взять эту строку, прочитанную из базы данных, и преобразовать ее в DateTime объект, таким образом, вы можете отформатировать ее так, как хотите, как дату. Чтобы сделать это, используя только год, вы можете использовать этот DateTime.ParseExact метод. Вот небольшой пример. Я отредактировал его, чтобы включить случаи, когда строка — это не просто год. Вероятно, есть более приятный способ сделать это (попробовать внутри Try — это не самая приятная вещь), но я оставлю это на ваше усмотрение.

 Sub Main()
    Dim Dates() As String = {"2007", "2-29-2008", "5/29/2006"}
    Dim oDate As DateTime

    For i As Integer = 0 To 2

        'Try to parse as formatted date
        Try
            oDate = DateTime.Parse(Dates(i))

        Catch castEx As FormatException
            'Could not format normally, try treating as solely a year
            Try
                oDate = DateTime.ParseExact(Dates(i), "yyyy", Nothing)

            Catch ex As Exception
                Console.WriteLine(ex.Message)
                Continue For
            End Try

        End Try
        'Print converted date
        Console.WriteLine(oDate.ToString())
    Next
    Console.ReadLine()
End Sub
 

Здесь yyyy указывается, что он считывается только в значении года.
Это выводит:

 01/01/2007 12:00:00 AM 
 

Но помните, что метод toString для datetime перегружен, поэтому, если вы используете oDate.ToString("dd-MM-yyyy") его, он будет печатать:

 01-01-2007 
 

Я использовал эту страницу в качестве ссылки.

Примечание: Это можно сделать точно так же с Date объектом вместо a DateTime , поскольку они используют одни и те же методы.

Это не оптимальный способ хранения / использования дат, когда это возможно, вы должны использовать фактические типы данных даты вместо текста в вашей базе данных. Если еще не слишком поздно, я бы предложил переосмыслить ваши столбцы, но если на данный момент это выходит из-под вашего контроля, можно использовать обходные методы, подобные этим.

Комментарии:

1. Спасибо тебе, Патрик. как сделать эту часть кода (dim idate как string =»2007″ .. в моем коде.

2. Когда вы получаете значение из product_date , оно уже является строкой, поэтому вы хотели бы использовать это значение вместо строки в моем примере. Вы также захотите сделать это только в том случае, если первое преобразование завершится неудачей.

3. Спасибо вам за помощь. когда я вернусь домой, я обязательно попробую это сделать.

4. Большое вам спасибо , Патрик … все решено … очень мило с вашей стороны … Сердечно .. САБРИНА