6

子オブジェクトの複合体であるビジネス オブジェクトがあります。
Visual Studio 2008 でデータバインディングを使用して、Windows フォームのコントロールにバインドしています。

しかし、フォームの InitializeComponent メソッドで上記のエラーが発生しています。

ジェネリック リスト ChildListObject を含む ParentObject というオブジェクトがあるとします。ParentObject には、それ自体が Child オブジェクトを持つ Child オブジェクトもあります。(つまり、ParentObject.ChildObject.ChildObject)

メインのバインディング ソースを設定します。

BindingSource.Datasource = ParentObject

グリッドを追加し、バインディング ソースを設定します。

GridBindingSource.Datasource = ParentObject

DataMember を次のように設定します。

BindingSourceB.DataMember = "ChildListObject"

これで、グリッドのデータソースが GridBindingSource に設定されました。

Me.MyDataGridView.DataSource = Me.GridBindingSource

ParentObject および ParentObject.ChildObject のプロパティにバインドされている他のコントロールもあります。

孤立したプロジェクトでこれをテストしたところ、問題なく動作しましたが、実際のバグが何であるかを見つけるのに苦労していますか? 以前は機能していたコードが突然機能しなくなります。

私が得るエラーは次のとおりです(上記の例でオブジェクトの名前を使用した場合):

「DataMember プロパティの ChildObject が DataSource に見つかりません」

次の場合に失敗します。

Me.MyDataGridView.DataSource = Me.GridBindingSource

奇妙なことに、 <System.Diagnostics.DebuggerStepThrough()> を削除してから、失敗したときに続行するだけで問題ありませんか??? しかし、実行時にはまだ失敗します。

誰かが私を正しい方向に向けることができるアイデアを持っていますか? 私がグーグルで見つけた最も近いものは、生成されたデザイナーコードの順序が混乱している可能性があるということです。機能していたコードが突然機能しなくなります。


この問題は行き来するようです。エラーが発生した後に続行すると、プログラムは問題なく続行されます。おそらくVSのバグです。しかし、実行時にエラーがまだ存在します。

この問題の原因は何ですか? 発生を止めるにはどうすればよいですか?

4

6 に答える 6

4

私はこれについていくつかの実験を試みました。この状態で問題が発生するのは、BaseFormとBindingSourceがある場合、このBaseFormから新しいExplicitFormを継承する
場合、またはBindingSource(BaseFormによって継承される)に関連するAttachedFormに追加のバインディングソースがある場合のみです。エラー。デザイナーソリューションはありませんが、単に無視して続行すると、プロジェクトを再度ビルドするときにすべてが正常になります。そうしないと、コードでデータメンバーを設定する必要があります。

于 2011-06-07T07:26:54.150 に答える
2

次のように、生成コードをForm_Loadイベントに移動するだけです。

private void MainForm_Load(object sender, EventArgs e)
{
    Me.MyDataGridView.DataMember = "DataMember";
    Me.MyDataGridView.DataSource = "DataSource";
}
于 2011-05-30T07:32:25.437 に答える
2

私が見つけた唯一の回避策は、次のことです。

  1. グリッドからすべての列を削除します
  2. 必要な列をグリッドに追加して戻します (これにより、次のステップで列が削除されなくなります)。
  3. グリッド データソースを削除する
  4. フォーム ロード イベントでグリッドのデータソースを設定します。
于 2009-10-28T21:33:28.363 に答える
1

Datamember は、表示するリストのプロパティを定義する文字列である必要があります。ここでは必要ありません。

これは理にかなっています:

BindingSourceB.Datasource = ParentObject.ChildList;

グリッドにバインドする場合は、Datamember を設定しません。Datasource を設定し、デザイナーを使用してグリッドを構成するだけです。

GetType は、デザイナーを支援するために存在します。デザイナーのプロパティで、BindingSourceB を ChildListObject タイプに設定してから、上記の手順を実行する必要があります。

于 2009-02-26T01:43:34.110 に答える