[英]Visual Studio 2010: Binding Issues
我有一个最初在VS2008中编写的C#Windows Forms应用程序,已移植到VS2010。 它在我们使用两个日期属性编写的对象之间绑定,并绑定到两个日期时间选择器控件。
这是设计器代码,显示了日期时间选择器之一的绑定。 另一个是相同的,除了名称:
private System.Windows.Forms.DateTimePicker dtTradeDate;
this.dtTradeDate = new System.Windows.Forms.DateTimePicker();
//
// dtTradeDate
//
this.dtTradeDate.DataBindings.Add(new System.Windows.Forms.Binding("Value", this.bsWorkflowItem, "TradeDate", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.dtTradeDate.Format = System.Windows.Forms.DateTimePickerFormat.Short;
this.dtTradeDate.Location = new System.Drawing.Point(383, 43);
this.dtTradeDate.Name = "dtTradeDate";
this.dtTradeDate.Size = new System.Drawing.Size(99, 20);
this.dtTradeDate.TabIndex = 37;
对象属性设置为获取/设置属性:
public DateTime TradeDate
{
get { return _tradeDate; }
set { _tradeDate = value; }
}
表单启动时,我们将表单的绑定源绑定到对象。 您可以看到我添加了一些明确的代码来避免出现以下情况,但这没有效果:
//Initializing workflow item object
_wfItem = new CamraWorkflowItem(UserSession.User);
_wfItem.TradeDate = DateTime.Today;
_wfItem.EffectiveDate = DateTime.Today;
loading.IncrementLoadingSteps(2);
dtEffDate.Value = DateTime.Today;
dtTradeDate.Value = DateTime.Today;
bsWorkflowItem.DataSource = _wfItem;
现在这是一个非常非常奇怪的部分。 这在VS2008以及我同事的两个VS2010工作站上都可以很好地工作。 但是它不适用于我的。 当它到达最后一行时,出现以下异常:
System.ArgumentOutOfRangeException越过了本机/托管边界
消息=“ 1/1/0001 12:00:00 AM”的值对于“ Value”无效。 “值”应介于“ MinDate”和“ MaxDate”之间。 参数名称:值
源= System.Windows.Forms
ParamName = Value StackTrace:位于System.Windows.Forms.DateTimePicker.set_Value(DateTime值)InnerException:
我在这里茫然。 如果我断开两个绑定,它都可以正常工作,但是显然我需要绑定来更新对象。 同样奇怪的是,如果我在调试器中查看这两个日期的值(显示异常框),我看到一个有效的日期。 见下文:
对象上的日期值是相同的,因此它们显然看起来在控件的有效日期范围内。
这看起来像是Visual Studio中的错误...除了它可以在我的同事的具有.NET和Visual Studio相同版本的计算机上使用。 我花了整整一天时间来破解它,但我很茫然……非常感谢您的帮助。
在您的位置,我会:
在CamraWorkflowItem.TradeDate属性设置器和获取器上使用断点进行调试,并确保其具有您期望的值。
发布完整的堆栈跟踪。
我有一个答案...或更准确地说,是一个讨厌的解决方法。
通过打破设计器中的数据绑定,然后将设计器先前生成的代码粘贴到将绑定源绑定到对象的位置之后 ,进行绑定...,它的工作原理是:
bsWorkflowItem.DataSource = _wfItem;
this.dtTradeDate.DataBindings.Add(new System.Windows.Forms.Binding("Value", this.bsWorkflowItem, "TradeDate", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.dtEffDate.DataBindings.Add(new System.Windows.Forms.Binding("Value", this.bsWorkflowItem, "EffectiveDate", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
Getter和Setter现在可以正常工作,并且属性已正确绑定。 没有例外发生。
但这对我来说毫无意义。 有人知道为什么吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.