DataGridView尝试使用格式化值保存绑定数据?

时间:2015-05-06 15:56:07

标签: c# sql-server datagridview

我正在尝试从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。

有没有人有可能帮助我的建议?

由于

1 个答案:

答案 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);