DataGridView C # Режим редактирования значения формата после редактирования - PullRequest
0 голосов
/ 21 марта 2012

У меня есть сетевое представление в проекте C # Winform.Это сетевое представление используется для вставки значений в базу данных.Каждый столбец соответствует соответствующему столбцу БД.

Один из столбцов является столбцом DateTime.Я хочу «подтвердить» эту дату, чтобы убедиться, что она в правильном формате.В идеале вы должны покинуть ячейку, и она конвертирует ее в формат даты и времени, который я выберу.

Я использовал серию событий, чтобы попытаться создать эту функцию, но у меня были проблемы.Проблема, с которой я постоянно сталкиваюсь, заключается в том, что при возникновении события значение еще не сохраняется в ячейке.Поэтому, когда я делаю что-то вроде этого, например:

private void Grid_Modify_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    if (Grid_Modify.Columns[e.ColumnIndex].Name == "DateTime")
    {
        Grid_Modify[e.ColumnIndex, e.RowIndex].Value = 
           Convert.ToDateTime(Grid_Modify[e.ColumnIndex, e.RowIndex].Value).ToString("YYYY-MM-DD hh:mm:ss");
    }
}

Проблема в том, что значение, которое оно преобразует в дату-время, является исходным значением ячейки, а не новым значением, которое я только что ввел.Я предполагаю, что это потому, что событие запускается до того, как обновляется значение ячейки.

Вопрос: как лучше всего форматировать дату, когда я изменяю ее значение?

Другие событияЯ пробовал: CellLeave, CellValueChanged, CellValidated и CellEndEdit.

ПРИМЕЧАНИЕ. Событие CellValueChanged было единственным событием, которое фактически могло получить новое значение ячейки, однако оно попадает в бесконечный цикл, когда я изменяюзначение в обработчике события.

1 Ответ

4 голосов
/ 21 марта 2012

Самое простое - вернуться к обработчику событий CellValueChanged и использовать глобальную переменную, чтобы избежать бесконечного цикла:

 private bool _inCellValueChanged = false;

Затем в CellValueChanged:

if (!_inCellValueChanged && Grid_Modify.Columns[e.ColumnIndex].Name == "DateTime") 
{ 
    _inCellValueChanged = true;        
    Grid_Modify[e.ColumnIndex, e.RowIndex].Value = Convert.ToDateTime(Grid_Modify[e.ColumnIndex, e.RowIndex].Value).ToString("YYYY-MM-DD hh:mm:ss");
    _inCellValueChanged = false; 
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...