3

Winformsのデータバインディングで問題が発生し続けます。具体的には、として使用するピリオドで区切られたプロパティパスを指定するたびに問題が発生しますDataMember。例えば:

public partial class SomeForm : System.Windows.Forms.Form
{
    public SomeForm(Book bookToBeDisplayed)
    {
        InitializeComponent();

        authorLabel.DataBindings.Add("Text", bookToBeDisplayed, "Author.Name");  
                                          // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                          //    I cannot get this to work.
    }
}


public class Book : INotifyPropertyChanged
{
    public Person Author { … }
    …
}

public class Person : INotifyPropertyChanged
{
    public string Name { … }
    …
}

との間にバインディングを追加している行は 、次の例外authorLabel.Textをスローします。bookToBeDisplayed.Author.Name

ArgumentException:データソースのプロパティまたは列Nameにバインドできません。

についてのMSDNページSystem.Windows.Forms.Bindingの「備考」セクションでは、ピリオドで区切られたナビゲーションパスを次のように使用できると説明していますDataMember

プロパティが他のオブジェクトへの参照を返すオブジェクト(他のクラスオブジェクトを返すプロパティを持つクラスなど)にバインドするときに、ピリオドで区切られたナビゲーションパスを使用することもできます。

上記の例を機能させるにはどうすればよいですか?

  • Bookのコンストラクターに渡されたインスタンスSomeFormが適切に初期化されていること、および参照がないことをすでに確認しましたnull
  • 私もに頼りたくありませんDataSets
4

2 に答える 2

1

私は解決策を見つけました。どうやら、はDataSource単一のオブジェクトではなく、コレクションである必要があります。

authorLabel.DataBindings.Add("Text",
                             new Book[] { bookToBeDisplayed },  // <--
                             "Author.Name");

MSDNページの「データバインディングとWindowsフォーム」の「データバインディングの種類」のセクションでは、 「単純」と「複雑」の2種類のデータバインディングがあると述べています。後者のバインディングタイプは、「リストベースのバインディング」とも呼ばれます。ナビゲーションパスは、後者のバインディングタイプでのみサポートされているようです。

PS: MSDNでもBindingList<T>、を使用することをお勧めしますが、ここではおそらく必要ありません。

于 2011-08-08T20:40:32.647 に答える
-1

これを試すことができます

authorLabel.DataBindings.Add("Text",bookToBeDisplayed.Author,"Name");
于 2012-05-17T10:00:49.240 に答える