[visual-studio]我能从 System.Windows.Forms.Form 类继承的类始终在代码视图中打开吗?

发布时间: 2014/3/1 4:25:02
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我在 Windows 窗体项目。在中,我需要一个类,该类继承 System.Windows.Forms.Form ,命名为 FormBase.cs 和继承 System.Windows.Forms.Form 类。在解决方案资源管理器中,但是 FormBase.cs 有像 Windows 窗体视图...现在当我尝试从解决方案资源管理器打开文件时它在设计模式下打开。因为它是简单 class 我期望它必须在不在设计视图中代码视图中打开。为什么会这样呢?如果我想我应该怎么做 FormBase.cs 总是在代码视图中打开,重新获得其在解决方案资源管理器中的类视图? FormBase.cs 看起来像:

public class FormBase : System.Windows.Forms.Form
{
    public virtual Dictionary<string, string> NonSaveableReasons()
    {
        Dictionary<string, string> _nonSavebleReasons = new Dictionary<string, string>();

        //MaskedTextBox.MaskedTextBox and MaskedTextBox.MyCombo are Custom Components
        //which are of type TextBox and ComboBox respectively
        //having 2 more properties name as "IsMandatory" and "LabelName"

        foreach (MaskedTextBox.MaskedTextBox maskTextBox in this.Controls.OfType<MaskedTextBox.MaskedTextBox>())
        {
            if (maskTextBox.IsMandatory && string.IsNullOrEmpty(maskTextBox.Text) && !_nonSavebleReasons.ContainsKey(maskTextBox.Name))
                _nonSavebleReasons.Add(maskTextBox.Name, maskTextBox.LabelName + " is mandatory.");
        }

        foreach (MaskedTextBox.MyCombo myCombo in this.Controls.OfType<MaskedTextBox.MyCombo>())
        {
            if (myCombo.IsMandatory && string.IsNullOrEmpty(myCombo.Text) && !_nonSavebleReasons.ContainsKey(myCombo.Name))
            {
                if (!_nonSavebleReasons.ContainsKey(myCombo.Name))
                    _nonSavebleReasons.Add(myCombo.Name, myCombo.LabelName + " is mandatory.");
            }
        }

        return _nonSavebleReasons;
    }

    public string GetValidationStringMsg(Dictionary<string, string> nonSavableResons)
    {
        return nonSavableResons != null ? String.Join(Environment.NewLine, nonSavableResons.Select(a => a.Value).ToArray()) : string.Empty;
    }
}

解决方法 1:

您可以使用System.ComponentModel.DesignerCategoryAttribute来防止 Visual Studio 设计器中打开一个特定文件。有两种方法,您可以应用此属性。

选项 A

第 1 步。将特性应用于 FormBase 、 指定 "" 作为类别:

[System.ComponentModel.DesignerCategory("")]
public class FormBase : System.Windows.Forms.Form

第 2 步。适用于从派生的每个窗体的属性 FormBase ,指定 "Form" 作为类别:

[System.ComponentModel.DesignerCategory("Form")]
public partial class MainForm : FormBase

请注意,您必须使用完全限定的类型名称的属性。这不起作用:

// BAD CODE - DON'T USE
using System.ComponentModel;

[DesignerCategory("")]
public class FormBase : System.Windows.Forms.Form

选项 B

在 FormBase.cs以上 FormBase 、 添加一个虚拟类和应用属性,它指定 "" 作为类别:

[System.ComponentModel.DesignerCategory("")]
internal class Unused
{
}

public class FormBase : System.Windows.Forms.Form
{
    // ...
}

使用此方法,您不需要将该属性应用到每个窗体产生的 FormBase ,代价是一个未使用的类。

官方微信
官方QQ群
31647020