var this.Parent as STP2Main更好的语法

时间:2012-11-13 15:26:29

标签: c# winforms visual-studio-2010 controls parent

如果我将控件加载到表单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);
    }

如果我将控件加载到表单B中,我需要这样写:

    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'是'type',在给定的上下文中无效

如何摆脱Parent.Parent.Parent部分?

2 个答案:

答案 0 :(得分:0)

如果父控件是Form,您可以使用

var C = this.ParentForm as SomeControlName;

我希望这会有所帮助。

答案 1 :(得分: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);
    }
}