【问题标题】:var this.Parent as STP2Main better syntaxvar this.Parent as STP2Main 更好的语法
【发布时间】:2012-11-02 01:08:43
【问题描述】:

如果我将控件加载到表单 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”是一个“类型”,在给定的上下文中无效

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

【问题讨论】:

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


    【解决方案1】:

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

    var C = this.ParentForm as SomeControlName;
    

    我希望这会有所帮助。

    【讨论】:

    • 我不会处置父母。我只是在同一个命名空间的不同类中调用一个函数。该函数必须使用现有的类,而不是创建一个新的。
    • 我所写的内容如何使您相信此代码将处置父级?它只是避免重写那些丑陋的代码——仅此而已。我也没有您在上述 cmets 中提供的信息,因此反对票很苛刻。如果父级是一个表单——你可以使用this.ParentForm——或者设计一个递归获取你需要的控制的方法......
    • 抱歉,我没有否决您的评论。我将检查 this.ParentForm 函数。函数 DisposeControl(this.Parent.Parent.Parent) 将使用该函数背后的代码处置父级。这就是我产生这种想法的地方。非易失性存储器。如果您只是将答案更改为使用 this.ParentForm 而不是 this.Parent.Parent.Parent 等(如果父级是表单)。这解决了我的问题。我会投票并接受:)
    【解决方案2】:

    这并不难。只需继续检查控件的父级,直到您用完要检查的父级,或者找到合适的类型之一。我写这个是为了更笼统;您可以将它用于任何类型的父级(只需将其放在泛型类型中),而不是使用特定操作,我为在父表单上调用的方法提供了一个参数。

    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-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-19
      • 2014-07-14
      • 2013-08-01
      相关资源
      最近更新 更多