【问题标题】:Creating a Common Class to share MenuControls创建一个公共类来共享 MenuControls
【发布时间】:2014-10-16 18:42:08
【问题描述】:

我有一个包含几种不同表单的程序,这些表单中的大多数都有一些重复,尤其是在涉及表单操作控件时。如何创建一个通用类,这样我在每个表单上都没有相同的代码,但仍然能够操作单个表单。例如,下面的代码是一个 ToolStripMenuControl,用于使表单始终位于顶部。我有这个代码以其他形式重复了 4 次,但我似乎无法理解如何为此创建一个共享控件。我在这里错过了什么?

    public bool onTop = false;
    public bool ToggleTop()
    {
        if (onTop)
        {
            onTop = false;
            this.TopMost = false;
            keepOnTopToolStripMenuItem.Checked = false;
            return onTop;
        }
        if (!onTop)
        {
            onTop = true;
            this.TopMost = true;
            keepOnTopToolStripMenuItem.Checked = true;
            return onTop;
        }
        else return onTop;
    }

    private void keepOnTopToolStripMenuItem_Click(object sender, EventArgs e)
    {
        ToggleTop();
    } 

【问题讨论】:

  • 听起来很简单,但考虑到这会切换一个布尔值,它将存储在另一个类中,如何防止表单在布尔值设置为默认值的情况下重新生成这个实例?只需将布尔值存储在引用类的表单上?
  • 另外,也不是那么容易,因为在上面的代码中 this.TopMost 没有引用一个类。 keepOnTopToolStripMenuItem 也没有。

标签: c#


【解决方案1】:

您无需存储单独的bool onTopForm.TopMost 已跟踪完全相同的值。

对于这个简单的任务,您的代码太长了。你可以简单地改写为:

public class Form5 : Form {

    CheckBox cbTopMost = new CheckBox { Text = "Top Most" };

    public Form5() {
        Controls.Add(cbTopMost);

        cbTopMost.CheckedChanged += delegate {
            this.TopMost = cbTopMost.Checked;
        };
    }
}

如果您真的需要,让您的所有表单都扩展一个基本表单,例如示例。

【讨论】:

    【解决方案2】:

    在您的情况下,我会使用一些具有通用实现的基本形式。这意味着您将把这段代码移到某个单独的基类中,并且所有带有此 ToolStripMenuControl 的表单都将从它派生。

    protected class FormWithToolStripControl : Form
    {
        //Initialization of ToolStripControl will be somewhere here
    
        //And here your common code for all forms derived from this class
        public bool onTop = false;
        public bool ToggleTop()
        {
            if (onTop)
            {
                onTop = false;
                this.TopMost = false;
                keepOnTopToolStripMenuItem.Checked = false;
                return onTop;
            }
            if (!onTop)
            {
                onTop = true;
                this.TopMost = true;
                keepOnTopToolStripMenuItem.Checked = true;
                return onTop;
            }
            else return onTop;
        }
    
        private void keepOnTopToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ToggleTop();
        } 
    }
    

    【讨论】:

    • 感谢您的回答,我担心可能是这种情况。由于我使用 VS 自动生成创建了所有表单,因此这将比它的价值更麻烦。我基本上必须重写整个事情,最后这段代码可能不会被复制,而是其他代码会被复制。
    猜你喜欢
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    相关资源
    最近更新 更多