我正在尝试从mssql数据库格式化时间值。该值以hhmm作为格式存储在数据库中(例如:1900或2130)我无法编辑数据库格式,因为它也被其他软件使用。
它自动绑定到DataGridView,这非常有效。然而,我正在努力的规范说它必须显示为标准时间格式。所以我使用了CellFormatting事件来显示19:00和21:30这样的时间。
它显示的值很好,但是当我使用DataGridView编辑此值时,它不会将其更改回未格式化的值,因此我在编辑框中获取格式化的值。如果我没有删除冒号,我会得到一个关于输入无效的例外情况。
我的理解是格式化的值和真实值不一样,这不会导致问题。
我的格式化他的代码:
private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
if (e.ColumnIndex == -1)
return;
string CellName = dataGridView1.Columns[e.ColumnIndex].Name;
if (timeFormattedCells.Contains(CellName))
{
if (e.Value != null)
{
try
{
string currentFormat = e.Value.ToString();
if (currentFormat.Length == 3)
{
currentFormat = "0" + currentFormat;
}
DateTime dateTime = DateTime.ParseExact(currentFormat, "HHmm",CultureInfo.InvariantCulture);
currentFormat = dateTime.ToShortTimeString();
e.Value = currentFormat;
e.FormattingApplied = true;
}
catch (FormatException)
{
e.FormattingApplied = false;
}
}
}
}
我还需要确保用户不能将无效时间设置为2405或1299。
有没有人有可能帮助我的建议?
由于
答案 0 :(得分:0)
只要您的CellFormatting事件按照您想要的方式格式化,我可能会首先检查时间的有效性,然后将其转换为int ...我会尝试这样的事情:
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
bool valid;
DataGridView dgv = (DataGridView)sender;
DataGridViewCell cell = dgv.Rows[e.RowIndex].Cells[e.ColumnIndex];
// Regex pattern acceptable for a time format
Regex timeRegex = new Regex("^([0-1]?[0-9]|[2][0-3]):([0-5][0-9])$");
if (cell.Value == null || cell.Value.ToString() == string.Empty)
{
cell.Style.BackColor = Color.White;
cell.ToolTipText = string.Empty;
cell.Tag = "empty";
valid = false;
}
// If the regex does not match then the format is invalid
else if (!timeRegex.IsMatch(cell.Value.ToString()))
{
cell.Style.BackColor = Color.Beige;
cell.ToolTipText = "Invalid format.";
cell.Tag = "invalid";
valid = false;
}
else
{
cell.Style.BackColor = Color.White;
cell.ToolTipText = string.Empty;
cell.Tag = "valid";
valid = true;
}
if(valid)
{
string timeToConvert = cell.Value.ToString();
string timeConvertReady = timeToConvert.Replace(":", "");
int timeAsInt = Convert.ToInt32(timeConvertReady);
updateTimeInDatabase(timeAsInt);
}
}
updateTimeInDatabase(timeAsInt)将是一个发送更新命令的方法。这也可以是TableAdpater方法或您正在使用的任何方法。如果它是TableAdapter,则语法看起来像testTableAdapter.Update(timeAsInt);