DatePicker.Value.Set绑定到数据源的错误

时间:2013-04-05 00:36:42

标签: entity-framework-5 datetimepicker

我在VS2012的表单上有一个名为binding的bindingsource控件,并且绑定了一个DateTimePicker控件。

对于绑定属性我有MinDate = 1/01/1753和MaxDate = 31/12/9998 通过从日历5/04/2013 11:27 AM选择今天来设定价值

我使用

设置了绑定源
var dset = base.Context.ContactEvents;
var qry = dset.Where(p => p.Id > 0).OrderBy(x => x.Id);
qry.Load();
this.bindingSource.DataSource = dset.Local.ToBindingList();

bindingsource以下列方式使用;

 public void RefreshBindingDataSourceAndPosition(BindingSource binding)
  {
    binding.DataSource = this.bindingSource.DataSource;  // error raised here
    binding.Position = this.bindingSource.Position;
  }

错误信息是

  

System.ArgumentOutOfRangeException越过了本机/托管边界     的HResult = -2146233086     消息='1/01/0001 12:00:00 AM'的值对'Value'无效。 '价值'应介于'MinDate'和'MaxDate'之间。   参数名称:值     来源= System.Windows.Forms的     PARAMNAME =价值     堆栈跟踪:          在System.Windows.Forms.DateTimePicker.set_Value(DateTime value)     InnerException:

我可以通过不绑定数据选择器并在EventsBindingSource_CurrentChanged事件中设置它来解决此问题

然而,必须这样做似乎很奇怪。如何使数据绑定工作?

[更新] 此问题与描述here的问题类似 我试图在一个更简单的项目中重现问题,以便尝试找出原因,但它适用于更简单的项目。该项目也适用于另一台计算机。 我的计算机上同时出现SQL Server 2012和2008R2的问题。我尝试在控制面板中更改日期格式和国家/地区。此外,我已尝试格式属性的不同设置。我也尝试设置日期字段以支持null。

当我将错误复制到剪贴板时,它显示以下内容;

  

发生了System.Reflection.TargetInvocationException     的HResult = -2146232828     Message =调用目标抛出了异常。     来源= mscorlib程序     堆栈跟踪:          at System.RuntimeMethodHandle.InvokeMethod(Object target,Object [] arguments,Signature sig,Boolean constructor)          at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj,Object [] parameters,Object [] arguments)     InnerException:System.ArgumentOutOfRangeException          的HResult = -2146233086          消息='1/01/0001 12:00:00 AM'的值对'Value'无效。 '价值'应介于'MinDate'和'MaxDate'之间。   参数名称:值          来源= System.Windows.Forms的          PARAMNAME =价值          堆栈跟踪:               在System.Windows.Forms.DateTimePicker.set_Value(DateTime value)          InnerException:

我的EF课程如下

public class ContactEvent : LoggedEntity
{

    public virtual SortableBindingList<ContactEventAttendee> Attendees { get; private set; }
    public virtual ContactEventType ContactEventType { get; set; }
    public string Details { get; set; }
    public DateTime? EventTime { get; set; }
    public virtual SortableBindingList<ContactEventItem> Items { get; private set; }
    public int State { get; set; }
    public string Title { get; set; }
    public override string ToString()
    {
        return "Contact Events";
    }
}

它继承自

public abstract class LoggedEntity
{

   public LoggedEntity()
    {
        this.RowId = Guid.NewGuid();
        this.RowVersionId = 0;
        AppDomain dm = AppDomain.CurrentDomain;  // Gets the current application domain for the current Thread.
        object s = AppDomain.CurrentDomain.GetData("SiteNumber");
        this.SourceSiteNumber = Convert.ToInt32(s);
    }

    public LoggedEntity(int SiteNumber)
    {
        // the following 3 are used to identify the version 
        this.RowId = Guid.NewGuid();
        this.RowVersionId = 0;
        this.SourceSiteNumber = SiteNumber;
    }

    public int Id { get; set; }
    public Guid RowId { get; set; }

    [ConcurrencyCheck]
    public int RowVersionId { get; set; }
    public int SourceSiteNumber { get; set; }

}

[更新] 类似的问题是here

[更新] 另一个here让我觉得我需要看一下如何处理密钥。

[更新] 我在输出窗口中注意到以下内容

A first chance exception of type 'System.ArgumentOutOfRangeException' occurred in System.Windows.Forms.dll

[更新] 这导致我 here

打开调试选项后发现错误

Invalid object name 'dbo.__MigrationHistory'.

然而,这是EF5中的已知错误

[更新]:我找到了另一个有类似未解决问题的人here 发现我在运行.EXE

时没有问题

[update]我可以通过禁用“当异常跨越App Domain或托管/本机边界时中断”来跳过错误 在工具 - &gt;选项 - &gt;调试 - &gt;一般

[update]我添加了以下内容,因此我可以检查控件属性。

    private void EventsBindingSource_BindingComplete(object sender, BindingCompleteEventArgs e)
    {
        // If the BindingComplete state is anything other than success, 
        // set the ErrorProvider to the error message.
        if (e.BindingCompleteState != BindingCompleteState.Success)
        {
            errorProvider1.SetError((Control)e.Binding.BindableComponent, e.ErrorText);
            var errdesc = e.ErrorText;
            var ctrl = (Control)e.Binding.BindableComponent;
              var info = string.Format(
               "{0} {1}",errdesc,
               ctrl.ToString());

            Debug.Print(info);
            // "Value of '1/1/0001 12:00:00 AM' is not valid for 'Value'. 
             'Value' should be between 'MinDate' and 'MaxDate'.\r\nParameter name: 
             Value System.Windows.Forms.DateTimePicker, Value: 1/1/1900 12:00:00 AM"

        }
        else
        {
            errorProvider1.SetError((Control)e.Binding.BindableComponent, "");
        }
    }

2 个答案:

答案 0 :(得分:4)

异常的原因可能是DatePicker的DataBinding“Value”属性已设置为BindingSource字段。 只需要设置DatePicker的DataBinding“Text”属性,数据绑定才能正常工作。 检查DatePicker的DataBinding“Value”属性字段中是否有值,一旦删除,问题就会消失。

答案 1 :(得分:0)

似乎关键问题是属性是Nullable DateTime。用于转录DateTimePicker组件的空值可能是'1 / 01/0001 12:00:00 AM',这会产生与MinValue和MaxValue配置相关的问题。使用DataBinding的Advanced选项卡有一个选项来设置要用于null的值。解决此问题的一种方法是将值设置为null作为MinDate,或者我们可以将MinDate设置为值'01 / 01/0001 12 :00:00'。尽管我的经验有限,但我相信这可能是你问题的根源。链接http://msdn.microsoft.com/en-us/library/aa480734.aspx可以在属性DataBinding的“高级”选项卡上看到其他内容。