0

私たちが取り組んでいるプログラムでは、ユーザーデータは、BindingSourcesを使用してビジネスエンティティにバインドされたデータであるUserControlsに収集されます。

UserControl内のすべてのBindingSourceをプログラムで見つける必要があります。

BindingSourceソースがUserControlのControlsコレクションに追加されていないため、そこで検索できません。

これはできますか?

4

2 に答える 2

2

BindingSourceは、Componentではなく、ですので、実際にコレクションControlで見つけることはできません。Controlsただし、デザイナでコンポーネントを追加するとcomponents、typeという名前のフィールドが作成されIContainer、コンポーネントが追加されます。このフィールドはプライベートであるため、宣言されているクラスからのみアクセスできます(リフレクションを使用しない場合)。

私はあなたが望むものを達成するための最も簡単な方法はGetBindingSourcesあなたのすべての使用しているコントロールにメソッドを追加することだと思います:

public IEnumerable<BindingSource> GetBindingSources()
{
    return components.Components.OfType<BindingSource>();
}

もちろん、BindingSourcesデザイナーで作成した場合にのみ機能し、動的に作成したものには機能しません(コンテナーに追加しない限り)

于 2010-06-03T18:18:42.040 に答える
0

最大の問題は、すべてのUserControlで使用できるメソッドのソリューションを見つけ、それでもVisualStudioのWinFormsデザイナーを使用できるようにすることでした。

UserControlから派生していないクラスでデザイナを使用する方法がわからないため、メソッドのないインターフェイスを作成しました。IBusinessEntityEditorViewと、そのようなビューを取得する拡張メソッドは、リフレクションを使用してコンポーネントフィールドを検索します。ここでBindingSourcesを検索します。

public interface IBusinessEntityEditorViewBase
{
}

...

public static void EndEditOnBindingSources(this IBusinessEntityEditorViewBase view)
{
    UserControl userControl = view as UserControl;
    if (userControl == null) return;

    FieldInfo fi = userControl.GetType().GetField("components", BindingFlags.NonPublic | BindingFlags.Instance);
    if (fi != null)
    {
        object components = fi.GetValue(userControl);
        if (components != null)
        {
            IContainer container = components as IContainer;
            if (container != null)
            {
                foreach (var bindingSource in container.Components.OfType<BindingSource>())
                {
                    bindingSource.EndEdit();
                }
            }
        }
    }
}
于 2010-06-04T08:37:01.243 に答える