Замена DateTime.MinValue в DataGridView - PullRequest
7 голосов
/ 20 февраля 2009

Я работаю над приложением записи имени, и информация хранится в базе данных 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.010001 пустой строкой ("") в моем 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 ​​пустой строкой.

Ответы [ 8 ]

5 голосов
/ 20 февраля 2009

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

if ((DateTime)(resultsGrid.CurrentRow.Cells["DateOfBirth"].Value) == DateTime.MinValue)
            {
                 // Set cell value to ""
            }
4 голосов
/ 24 февраля 2009

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

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

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

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

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

2 голосов
/ 12 декабря 2011

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

пример:

public DateTime? mydate;

и затем:

DGview.Rows.Add(mydate.HasValue ? mydate : null);
2 голосов
/ 20 февраля 2009

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

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

0 голосов
/ 20 февраля 2009

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

select coalesce(your_datetime_column,'01/01/0001') from your_table
0 голосов
/ 20 февраля 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, но, похоже, у вас правильная идея.

0 голосов
/ 20 февраля 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
0 голосов
/ 20 февраля 2009
if (yourDateOfBirth != null)
{
    Convert.ToDate(yourDateOfBirth) == DateTime.MinValue
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...