发布
社区首页 >问答首页 >具有不同格式的C# BindingSource和DateTime字段值,那么Db无法保存

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

Stack Overflow用户
提问于 2015-10-29 19:10:23
回答 1查看 5.1K关注 0票数 0

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

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

代码语言:javascript
代码运行次数:0
复制
tbSysDateFrom.DataBindings.Add("Text", myBindingSource, "SysDateFrom", true, DataSourceUpdateMode.OnValidation, "", "dd-MM-yyyy");

这个很管用。但是,当用户尝试输入日期,即23-12-2015年时,文本框将不接受它。我可以理解这一点,因为在数据库中,格式是MM/dd/yyyy,在本例中,数据源认为23是一个月值。

我在GridView中表示数据时也遇到了同样的问题。我可以将日期格式化为dd-MM-yyyy,但用户被迫以MM-dd-yyyy这样的格式输入日期。

我不知道怎么解决这个问题,谁也不知道。也许会改写一些方法?但是哪一个和什么时候?有人能让我走到正确的方向吗?

B.t.w.我必须使用文本框(不能使用数据报警器)

更新

好的,我想出了解决这个问题的方法。为此,我使用以下代码为textbox添加了一个验证事件:

代码语言:javascript
代码运行次数:0
复制
 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);
        }
    }

这是可行的,现在我必须对网格视图做同样的工作。我还是被困住了。当我在CellValidating事件中更改格式时,绑定源想要保存日期时会出现错误。

该错误与日期有关:"String被识别为有效的DateTime“。

如何解决这个问题,有什么建议吗?提亚

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-30 08:12:27

我解决了我的问题。首先,文本框问题(BTW所有控件都使用BindingSources绑定):

TextBox必须被格式化为dd。为此,我向TextBox添加了如下绑定

代码语言:javascript
代码运行次数:0
复制
tbSysDateTo.DataBindings.Add("Text", myBindingSource, "SysDateTo", true, DataSourceUpdateMode.OnValidation, "", "dd-MM-yyyy");

这很好,但是当我试图保存日期时,会因为格式错误而引发异常。我能够通过在这个TextBox的验证事件中重新格式化TextBox的文本来解决这个问题,比如:

代码语言:javascript
代码运行次数:0
复制
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,其中的datefield也显示为dd格式,我不得不做一些类似的事情。但我不知道该用哪个事件。Row_Validation或Cell_validation没有做到这一点。

最后,我使用了CellParsing事件,这个事件对我来说很好。

代码语言:javascript
代码运行次数:0
复制
 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;                
            }
        }
    }

请参阅:这是更多的信息

(更正了More Info中的链接,因为MS显然再次移动了内容)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33422679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档