0

Windowsフォームアプリケーション(vs2010、.net 4)で初めてEntity Framework(データベースが最初、Entity Framework 5)を使用しています。エンティティ オブジェクトと Windows フォーム コントロールの間のバインドに問題があります。テキストボックス、日時ピッカー、コンボボックスのコントロールがあります。バインドされたコントロールでウィンドウを開くと、正しいデータがコントロールに表示されます。ただし、コントロールの 1 つの値を変更し、タブでコントロールを離すと、値がオブジェクトにプッシュされていないかのように、値がコントロールの元の値に戻ります。コードの抜粋は次のとおりです。

私のエンティティオブジェクト:

namespace Entities
{
    using System;
    using System.Collections.Generic;

    public partial class ExternalDocument
    {
        public int ExternalDocumentID { get; set; }
        public bool Active { get; set; }
        public bool Closed { get; set; }
        public Nullable<int> CompanyID { get; set; }
        public Nullable<int> ContactID { get; set; }
        public string DocumentNbr { get; set; }
        public Nullable<System.DateTime> DocumentDate { get; set; }
        public Nullable<System.DateTime> DateReceived { get; set; }

        public virtual Company Company { get; set; }
        public virtual Contact Contact { get; set; }
    }
}

データ バインディング:

private void SetDataBindings()
        {
            LoadComboBoxValues();
            this.textDocumentNbr.DataBindings.Add("Text", this.document, "DocumentNbr");
            this.textDocumentNbr.Leave += new EventHandler(textDocumentNbr_Leave);
            this.dateDocument.DataBindings.Add(new Binding("Value", this.document, "DocumentDate"));
            this.dateReceived.DataBindings.Add("Value", this.document, "DateReceived");
            this.comboCompanyID.DataBindings.Add("SelectedValue", document, "CompanyID");
        }

オブジェクト プロパティが設定されているときにエンティティ フレームワーク エラーが発生するかどうか疑問に思っていましたが、そのようなエラーをトラップする適切な方法を見つけることができませんでした。私のエンティティ フレームワーク オブジェクトには、以前のバージョンのエンティティ フレームワーク用に作成された On< PropertyName >Changing メソッドがありません。フォーカスがコントロールを離れたときにエラーをトラップしようとしましたが、これは最善の方法ではないと思います:

private void dateDocument_Leave(object sender, EventArgs e)
        {

            string errorString = this.entitiesController.GetValidationErrors();
            this.errorDocumentDate.SetError(this.dateDocument, errorString);
        }



public string GetValidationErrors()
        {
            string errorString = "";

            List<DbEntityValidationResult> errorList = (List<DbEntityValidationResult>)this.finesse2Context.GetValidationErrors();
            if (errorList.Count > 0)
            {
                foreach(var eve in errorList)
                {
                    errorString += "Entity of type " + eve.Entry.Entity.GetType().Name + " in state" + eve.Entry.State + " has the following validation errors:"; ;
                    foreach (var ve in eve.ValidationErrors)
                    {
                        errorString += "- Property: " + ve.PropertyName + " Error: " + ve.ErrorMessage;
                    }
                }
            }

            return errorString;
        }

どんな助けでも大歓迎です。ありがとう!

4

1 に答える 1

0

バインディングで "formattingEnabled" が指定されていない限り、バインディングが null 非許容値をオブジェクトの null 許容プロパティにプッシュすると、例外が発生することが判明しました。

したがって、次のようなバインドが機能します。

this.dateDocument.DataBindings.Add(new Binding("Value", this.document, "DocumentDate", true));

これはしません:

this.dateDocument.DataBindings.Add(new Binding("Value", this.document, "DocumentDate"));

バインディングは単純にエラーをキャッチし、コントロールの値を元の値に置き換えるため、そのタイプのエラーをトラップする方法はまだ不明です。

于 2013-03-06T21:07:19.760 に答える