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 次 Parent)如果我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 回答