4

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 Message='1/01/0001 12:00:00 AM' の値は 'Value' に対して有効ではありません。「値」は「MinDate」と「MaxDate」の間にある必要があります。パラメーター名: 値 Source=System.Windows.Forms ParamName=Value StackTrace: System.Windows.Forms.DateTimePicker.set_Value(DateTime 値) で InnerException:

Data Picker をバインドせず、 EventsBindingSource_CurrentChanged イベントに設定することで問題を回避できます

しかし、これをしなければならないのは奇妙に思えます。データバインディングを機能させるにはどうすればよいですか?

[更新] この問題は、ここで説明されている問題に似てい ます。原因を特定するために、単純なプロジェクトで問題を再現しようとしましたが、単純なプロジェクトで機能します。また、プロジェクトは別のコンピューターで動作します。この問題は、SQL Server 2012 と 2008R2 の両方を使用しているコンピューターで発生します。コントロール パネルで日付形式と国を変更しようとしました。また、 format プロパティのさまざまな設定を試しました。また、null をサポートするように日付フィールドを設定しようとしました。

エラーをクリップボードにコピーすると、次のように表示されます。

System.Reflection.TargetInvocationException が発生しました HResult=-2146232828 Message=呼び出しのターゲットによって例外がスローされました。ソース = mscorlib StackTrace: System.RuntimeMethodHandle.InvokeMethod (オブジェクト ターゲット、オブジェクト [] 引数、シグネチャ sig、ブール コンストラクター) で System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal (オブジェクト obj、オブジェクト [] パラメーター、オブジェクト [] 引数) InnerException: System.ArgumentOutOfRangeException HResult=-2146233086 Message='1/01/0001 12:00:00 AM' の値は、'Value' に対して有効ではありません。「値」は「MinDate」と「MaxDate」の間にある必要があります。パラメーター名: 値 Source=System.Windows.Forms ParamName=Value StackTrace: System.Windows.Forms.DateTimePicker で。

私の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; }

}

[更新] 同様の問題はこちら

[更新]ここでもう 1 つ、キーがどのように処理されているかを確認する必要があると思います。

[更新] 出力ウィンドウで次のことに気付きました

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

[更新]これが私を ここに導いた

デバッグオプションをオンにした後、エラーが見つかりました

Invalid object name 'dbo.__MigrationHistory'.

ただし、これは EF5 の既知のバグです

[更新]:ここで同様の未解決の問題を抱えている別の人を見つけまし た.EXE の実行時に問題がないことを発見しました

[更新] [ツール] -> [オプション] -> [デバッグ] -> [全般] で [例外がアプリ ドメインまたはマネージド/ネイティブ境界をまたぐときにブレークする] を無効にすることで、エラーをスキップできます。

[更新] 以下を追加して、コントロールのプロパティを調べることができました。

    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, "");
        }
    }
4

2 に答える 2

5

例外の原因は、DatePicker の DataBinding の「Value」プロパティが BindingSource フィールドに設定されている可能性があります。データ バインディングを正しく機能させるために設定する必要があるのは、DatePicker の DataBinding の "Text" プロパティだけです。DatePicker の DataBinding の「Value」プロパティ フィールドに値があるかどうかを確認します。削除すると、問題は解消されます。

于 2014-02-16T18:01:41.497 に答える