Замена DateTime.MinValue в DataGridView

Я работаю над приложением для записи имен, и информация хранится в базе данных SQLite. Все столбцы в базе данных имеют тип TEXT, за исключением столбца даты рождения, который является DATETIME. Исходная база данных Access, которую я перенес в базу данных SQLite, допускала нулевое значение даты рождения, поэтому, когда я ее скопировал, я установил для всех нулевых значений значение DateTime.MinValue.

В моем приложении столбец даты рождения отформатирован следующим образом:

DataGridViewTextBoxColumn dateOfBirth = new DataGridViewTextBoxColumn();
        dateOfBirth.HeaderText = "DOB";
        dateOfBirth.DataPropertyName = "DateOfBirth";
        dateOfBirth.Width = 75;
        dateOfBirth.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
        dateOfBirth.DefaultCellStyle.Format = "MM/dd/yyyy";

Моя проблема в том, что в строках, где нет даты рождения, в базе данных есть DateTime.MinValue, который отображается в моем DataGridView как 01/01/0001.

Я ищу способ заменить 01/01/0001 пустой строкой ("") в моем DataGridView.

private void resultsGrid_DateFormatting(object sender, System.Windows.Forms.DataGridViewCellFormattingEventArgs e)
    {
        if(resultsGrid.Columns[e.ColumnIndex].Name.Equals("DateOfBirth"))
        {
            if ((DateTime)(resultsGrid.CurrentRow.Cells["DateOfBirth"].Value) == DateTime.MinValue)
            {
                 // Set cell value to ""
            }
        }
    }

Кто-нибудь знает, как я могу заменить DateTime.MinValue в моем DataGridView пустой строкой? Спасибо!

Изменить: приведение значения ячейки с помощью DateTime позволяет оператору if работать, но я все еще не могу понять кодировку для замены MinValues ​​пустой строкой.


person Jared Harley    schedule 20.02.2009    source источник
comment
Подобные вопросы и ответы были опубликованы в этом сообщении: stackoverflow.com/a/36492728/909689   -  person Kelvin Tan    schedule 08.04.2016


Ответы (7)


Вам просто нужно привести его к DateTime

if ((DateTime)(resultsGrid.CurrentRow.Cells["DateOfBirth"].Value) == DateTime.MinValue)
            {
                 // Set cell value to ""
            }
person Barbaros Alp    schedule 20.02.2009
comment
Я добавил ваше изменение в свой код выше, и это позволяет моему оператору if работать, но я все еще не могу понять код, чтобы фактически изменить содержимое ячейки. - person Jared Harley; 20.02.2009
comment
В операторе if, куда вы помещаете // Установить значение ячейки в ; я думаю, вам нужно написать этот код resultsGrid.CurrentRow.Cells[DateOfBirth].Value = Он должен это сделать - person Barbaros Alp; 20.02.2009
comment
resultsGrid.CurrentRow.Cells[DateOfBirth].Value = - person Barbaros Alp; 20.02.2009

Я обнаружил, почему отображается DateTime.MinValue!

Эта строка в разделе форматирования ячейки привела к отображению MinValue «01/01/0001»:

dateOfBirth.DefaultCellStyle.Format = "MM/dd/yyyy";

Без этой строки поле «Дата рождения» в моем datagridview остается пустым.

Барбарос Альп по-прежнему прав насчет того, что я пытался сделать в то время. Всем спасибо!

person Jared Harley    schedule 24.02.2009

Используйте нулевой формат DateTime вместо DateTime ("DateTime?") - не используйте строку.

пример:

public DateTime? mydate;

а потом:

DGview.Rows.Add(mydate.HasValue ? mydate : null);
person Pavel Krejci    schedule 12.12.2011

Хотя добиться необходимого преобразования может быть довольно просто (см. отличные ответы, предшествующие моему), я считаю, что в идеале вы должны заменить все значения DateTime.MinValue в этом конкретном столбце в базе данных на NULL. Это будет правильно отображать фактическое отсутствие данных в этой позиции. В настоящее время ваша база данных содержит неверные данные, и вы пытаетесь выполнить постобработку данных для отображения.

Следовательно, вы сможете обрабатывать отображение данных в GridView, используя свойства EmptyDataText или NullDisplayText для обеспечения надлежащего рендеринга.

person Cerebrus    schedule 20.02.2009
comment
Я новичок в работе с SQLite, поэтому могу ошибаться, но я думал, что DateTime не может быть нулевым. Если да, то это было бы оптимальным решением, потому что вы правы — на самом деле я поместил неверные данные в свою базу данных. - person Jared Harley; 20.02.2009
comment
К сожалению, я не работал с SQLite и знаю еще меньше, чем вы. Тем не менее, я думаю, что это стоит исследовать. Взгляните на документацию. Их сайт говорит мне, что в SQLite 2 все было бестиповым. Для SQLite3 — sqlite.org/datatype3.html - person Cerebrus; 20.02.2009

вы можете использовать объект как объект DateTime:

//create a nullable intermediate variable
System.DateTime? dtCellValue = resultsGrid.CurrentRow.Cells["DateOfBirth"].Value as System.DateTime?;

//if this cell has been set to String.Emtpy the cast will fail
//so ensure the intermediate variable isn't null
if ( dtCellValue.HasValue && dtCellValue == System.DateTime.MinValue )
//set cell value appropriately
person Jason    schedule 20.02.2009

private void resultsGrid_DateFormatting(object sender, System.Windows.Forms.DataGridViewCellFormattingEventArgs e)
{
    if(resultsGrid.Columns[e.ColumnIndex].Name.Equals("DateOfBirth"))
{
    if ((string)resultsGrid.CurrentRow.Cells["DateOfBirth"].Value == DateTime.MinValue.ToString())
    {
         // Set cell value to ""
    }
}

}

Или вам, возможно, придется привести к DateTime, а затем сравнить с MinValue, но похоже, что у вас есть правильная идея.

person mletterle    schedule 20.02.2009

Уже есть ответы, которые должны достичь того, чего вы хотите; но мне интересно, почему вы не помещаете NULL в базу данных для начала? В sqlite3 «datetime» — это более или менее просто строка (в столбце datetime нет ничего особенного, поскольку sqlite3 — это просто сходство типов, а не привязка типов), поэтому вы просто вставляете NULL в этот столбец. И если вы хотите иметь MinValue даты и времени при запросе, вы можете легко выполнить запрос, например

select coalesce(your_datetime_column,'01/01/0001') from your_table
person polyglot    schedule 20.02.2009