0

丸一日かけて徹底的に調べた基本的な質問です。

My Account オブジェクトには、Name プロパティを持つ KeyType オブジェクトがあり、すべて Linq to SQL によって生成されます。

私のバインディングソース:

var result = from account in Schema.Accounts select account as Account;
Data = new ComplexBindingList<Account>(result.ToList<Account>());
DataSource = Data;
ResetBindings(true);

Bradley Smith のブログから借用した私の ComplexBindingList には、次のインターフェイスがあります。

public class ComplexBindingList<T> : List<T>, ITypedList

これは私の DataGridView で動作します:

Columns.Add(CreateColumn("KeyType.Name", "Key Type");

このコードは例外の直前に機能するため、データは問題ありません。

var v = account.KeyType.Name;

これは私の TextBox では機能しません。「オブジェクト 'EPM.BODA.KeyType' のプロパティ アクセサ 'Name' が次の例外をスローしました:'オブジェクトがターゲット タイプと一致しません。'」という例外が発生します。

// Controller is my BindingSource
Binding binding = EditField.DataBindings.Add("Text", Controller, "KeyType.Name");

リフレクションが適切に機能していないという一般的な印象がありますが、ギャップを埋める方法の詳細が見つからないようです。どんな助けにも乾杯。

4

1 に答える 1

0

これは、簡単な回避策として、これまでのところ私が持っているものです。

public virtual Binding GetBinding(string fieldName)
{
    string[] pieces = fieldName.Split('.');
    if ( pieces.GetLength(0) == 1 )
    {
        return new Binding("Text", this, fieldName);
    }
    else
    {
        return new Binding("Text",
            Current.GetType().GetProperty(pieces[0]).GetValue(Current, null), pieces[1]);
    }
}

// Calling the helper function and adding the binding
EditField.DataBindings.Add(Controller.GetBinding(mapping.FieldName));
于 2012-04-23T01:21:33.253 に答える