1

エンティティ用のテキスト ボックスのグループを含む winforms アプリがあります。エンティティを呼び出しましょうProduct

別のデータベース オブジェクトへの外部キーを保持しているため、テキスト ボックスの 1 つが非表示になっていますBusiness Unit。親テーブルの値を検索するコンボボックスを使用して、非表示のテキスト ボックスに入力します。選択が変更されると、非表示のテキスト ボックスの値も変更されます。

private void businessUnitComboBox_SelectionChangeCommitted(object sender, EventArgs e)
    {
        this.businessUnitIdTextBox.Text = this.businessUnitComboBox.SelectedValue.ToString();

        this.businessUnitComboBox.Focus();
    }

問題は、私のコンテキストで SaveChanges を呼び出した後、非表示のテキスト ボックスに対するこの変更が保持されないことです。奇妙なことに、他のテキストボックスを更新すると、Product問題なく保存されます。

テキスト ボックスは、Visual Studio の GUI から標準のドラッグ アンド ドラッグ ドロップでプロジェクトに追加され、自動追加時にバインディング ソースが作成されました。

私のエンティティは、fody-propertychanged を使用して INotifyPropertyChanged を実装しています。

ここで問題を見つけるのに苦労しています。新しいレコードの作成は正常に機能しますが、その 1 つの外部キー値を更新することはできません。

これは、ナビゲーション プロパティであり、別の方法で処理する必要があるためですか、それとも、変更が保持されない理由について他の可能性がありますか? どんな助けでも大歓迎です。

4

1 に答える 1

1

Save メソッドに this.Validate() がないことが原因である可能性があります。このコードをフォームの save メソッドに入れます。

this.Validate();
this.yourBindingSource.EndEdit();
yourDbContext.SaveChanges();

データ バインディングの既定の動作は OnValidation です。

この動作を変更するには、テキスト ボックスのプロパティに移動し、データ バインディング パーツを開き、詳細を開き、データ ソース更新モードを OnPropertyChanged に変更します。

したがって、デザイナーが生成したコードでのデータバインディングのコードは次のようになります。

this.nameTextBox1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.productBindingSource, "Category.Name", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));

この場合、this.Validate変更を保存する前に使用する必要はなく、単に使用できます

this.yourBindingSource.EndEdit();
yourDbContext.SaveChanges();
于 2015-08-24T22:01:03.217 に答える