2

コントロールをフォームAにロードすると、次の機能を持つコントロールがあります。

    private void button1_Click(object sender, EventArgs e)
    {
        var C = this.Parent.Parent.Parent.Parent.Parent as STP2Main;
        C.DisposeControl(STP_Data.Data.ConfigConfigResource);
    }

コントロールをフォームBIにロードする場合、これを書き込むにはこれが必要です。

    private void button1_Click(object sender, EventArgs e)
    {
        var C = this.Parent.Parent.Parent as STP2Main;
        C.DisposeControl(STP_Data.Data.ConfigConfigResource);
    }

これは機能します。しかし、私は本当に好きではありませんthis.Parent.Parent...(最大5倍の親)var C行にブレークポイントを設定すると、それが指していることがわかりますが[STP_Design.STP2Main]、関数をに変更すると、var C = STP_Design.STP2Main as STP2Main;次のようなエラーが発生します:

'STP_Design.STP2Main'は'タイプ'であり、指定されたコンテキストでは無効です

Parent.Parent.Parentの部分を削除するにはどうすればよいですか?

4

2 に答える 2

0

親コントロールがであるForm場合は、

var C = this.ParentForm as SomeControlName;

これがお役に立てば幸いです。

于 2012-11-13T15:33:43.510 に答える
0

それほど難しいことではありません。チェックする親がなくなるか、適切なタイプのいずれかが見つかるまで、コントロールの親をチェックし続けます。これはもう少し一般的なものとして書きました。任意のタイプの親に使用でき(ジェネリックタイプに入れるだけです)、特定のアクションを使用するのではなく、親フォームで呼び出されるメソッドのパラメーターを提供しました。

public static void DisposeMainParent<T>(this Control control, Action<T> disposal)
    where T : Control
{
    Control temp = control;
    T mainControl = null;
    for (Control c = control; c != null && mainControl == null; c = c.Parent)
    {
        mainControl = temp as T;
    }

    if (mainControl != null)
    {
        disposal(mainControl);
    }
}
于 2012-11-13T15:44:12.850 に答える