C#BindingSource具有不同格式的DateTime字段值,则Db无法保存

C#BindingSource具有不同格式的DateTime字段值,则Db无法保存,c#,data-binding,datetime-format,C#,Data Binding,Datetime Format,我的数据源中有一些日期字段,我想在屏幕上的文本框中以不同的格式格式化这些日期,然后将它们存储在数据库中。我还希望用户能够更改此格式的日期。但这是不可能的。文本框不接受输入的日期 对于文本框中的格式设置,我使用: tbSysDateFrom.DataBindings.Add("Text", myBindingSource, "SysDateFrom", true, DataSourceUpdateMode.OnValidation, "", "dd-MM-yyyy"); 这很有效。但当用户尝试输

我的数据源中有一些日期字段,我想在屏幕上的文本框中以不同的格式格式化这些日期,然后将它们存储在数据库中。我还希望用户能够更改此格式的日期。但这是不可能的。文本框不接受输入的日期

对于文本框中的格式设置,我使用:

tbSysDateFrom.DataBindings.Add("Text", myBindingSource, "SysDateFrom", true, DataSourceUpdateMode.OnValidation, "", "dd-MM-yyyy");
这很有效。但当用户尝试输入日期时,即2015年12月23日,文本框将不接受该日期。我可以理解这一点,因为在数据库中,格式是MM/dd/yyyy。在本例中,数据源认为23是一个月值

在GridView中显示数据也有同样的问题。我可以将日期格式化为dd MM yyyy,但用户必须以类似于MM dd yyy的格式输入日期

我不知道如何解决这个问题,所以有人有想法吗。也许会覆盖一些方法?但是什么时候,什么时候?有人能给我指出正确的方向吗

B.t.w.我必须使用文本框(不能使用日期选择器)

[更新]

好的,我能想出如何解决这个问题的文本框。为此,我使用以下代码为textbox添加了一个验证事件:

 private void tbSysDateTo_Validating(object sender, CancelEventArgs e)
    {
        DateTime dateValue;

        if (!String.IsNullOrEmpty(tbSysDateTo.Text))
        {
            if (DateTime.TryParseExact(tbSysDateTo.Text, "dd-MM-yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out dateValue))
                tbSysDateTo.Text = String.Format("{0:MM/dd/yyyy}", dateValue);
        }
    }
这是可行的,现在我必须对gridview执行同样的操作。我还在这里。在CellValidating事件中更改格式时,bindingsource希望保存日期时出错

错误与日期有关:“字符串未被识别为有效的日期时间”


如何解决这个问题有什么建议吗?TIA

好了,我能够解决我的问题。首先是文本框问题(顺便说一句,所有控件都使用BindingSources绑定):

文本框的格式必须为dd-MM-yyyy。为此,我在文本框中添加了如下绑定

tbSysDateTo.DataBindings.Add("Text", myBindingSource, "SysDateTo", true, DataSourceUpdateMode.OnValidation, "", "dd-MM-yyyy");
这很好,但是当我试图保存日期时,由于格式错误,引发了一个异常。我可以通过在此文本框的验证事件中重新格式化文本框的文本来解决此问题,如:

private void tbSysDateTo_Validating(object sender, CancelEventArgs e)
{
    DateTime dateValue;

    if (!String.IsNullOrEmpty(tbSysDateTo.Text))
    {
        if (DateTime.TryParseExact(tbSysDateTo.Text, "dd-MM-yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out dateValue))
            tbSysDateTo.Text = String.Format("{0:MM/dd/yyyy}", dateValue);
    }
}
至于GridView,其中datefields的格式也显示为dd-MM-yyyy,我不得不做一些类似的事情。但我不知道该使用哪个事件。行验证或单元格验证没有达到目的

我最终使用了CellParsing事件,这对我来说很好

 private void dgv_CellParsing(object sender, DataGridViewCellParsingEventArgs e)
    {
        DateTime dateValue;

        // Confirm that the cell is not empty.
        if (!string.IsNullOrEmpty(e.Value.ToString()))
        {
            if (DateTime.TryParseExact(e.Value.ToString(), "dd-MM-yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out dateValue))
            {
                e.Value = dateValue;
                e.ParsingApplied = true;                
            }
        }
    }
见:


(更正了“更多信息”中的链接,因为MS显然再次移动了内容)

那么,是什么阻止您在将字符串日期存储到数据库之前将其重新格式化为正确的格式呢。。?此外,在GridView上,您在显示时使用的DataFormatString是什么?您可以将其显示为与MethodMan相同的格式:dd-MM-yyyy。我明白你说的话。但我的问题是如何和在何处(我应该使用哪个事件来重新格式化它)存储它,并且验证不会阻止进入下一个字段。如果没有看到您现有的代码,我无法确定地告诉您将它放在何处。。你能发布你现有的代码吗。。?