我的数据源中有一些日期字段,我想以不同的格式在屏幕上的文本框中格式化这些日期,然后将它们存储在db中。我还希望用户能够以这种格式更改日期。但这是不可能的。文本框不接受输入日期。
对于文本框中的格式设置,我使用:
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添加了一个验证事件:
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“。
如何解决这个问题,有什么建议吗?提亚
发布于 2015-10-30 08:12:27
我解决了我的问题。首先,文本框问题(BTW所有控件都使用BindingSources绑定):
TextBox必须被格式化为dd。为此,我向TextBox添加了如下绑定
tbSysDateTo.DataBindings.Add("Text", myBindingSource, "SysDateTo", true, DataSourceUpdateMode.OnValidation, "", "dd-MM-yyyy");
这很好,但是当我试图保存日期时,会因为格式错误而引发异常。我能够通过在这个TextBox的验证事件中重新格式化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,其中的datefield也显示为dd格式,我不得不做一些类似的事情。但我不知道该用哪个事件。Row_Validation或Cell_validation没有做到这一点。
最后,我使用了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;
}
}
}
请参阅:这是更多的信息
(更正了More Info中的链接,因为MS显然再次移动了内容)
https://stackoverflow.com/questions/33422679
复制相似问题