【问题标题】:Bad scope in forms application表单应用程序中的错误范围
【发布时间】:2013-12-03 03:52:16
【问题描述】:

我正在开发一个表单应用程序,但似乎误解了我的方法范围。我有 2 个工作方法 Split 和 AddToDatabase,我试图从 button1_click 事件处理程序中调用它们。然而,在处理程序中,Split() 和 AddToDatabase() 以红色突出显示,表示它们在当前上下文中不存在......有人知道为什么会这样吗?谢谢

namespace WindowsFormsApplication1
{
    class Content
    {
        public void Split()
        {
           //
        }

        public void AddToDatabase()
        {
           // 
        }
    }
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }
        public void Browse_Click(object sender, EventArgs e)
        {
            DialogResult result = openFileDialog1.ShowDialog();
            if (result == DialogResult.OK) // Test result.
            {
                string root = openFileDialog1.FileName;
            }
        }

        public void button1_Click(object sender, EventArgs e)
        {
            Split();
            AddtoDataBase();
        }
    }
}

【问题讨论】:

  • 虽然人们发布的答案是正确的,但您需要注意 Content 类中的成员访问权限将超出 Form1 类的范围。我的直觉是,您在Content.x/y 中的意图是引用Form1 的成员。如果是这种情况,您可以考虑将这些方法作为Form1 的一部分

标签: c# winforms button event-handling scope


【解决方案1】:

那是因为他们属于不同的班级。你需要这个:

var c = new Content();
c.Split();
c.AddToDatabase();

但这引出了一个问题,它们是否需要成为实例方法。如果它们不存储任何状态,则将它们设为static:

public static void Split() ...

public static void AddToDatabase() ...

然后这样称呼他们:

Content.Split();
Content.AddToDatabase();

【讨论】:

    【解决方案2】:

    您需要使用Content 类的instance 访问,因为这些方法在不同的类Content 中声明

    示例:

        Content c=new Content();
        c.Split();
        c.AddtoDataBase();
    

    【讨论】:

      【解决方案3】:

      它们不存在于该范围内,因为您已将它们放入另一个类 (Content)。在不知道为什么你这样做的情况下,我猜是“正确的答案,但是你要么需要创建一个Content 的实例并在上调用Split 和AddToDatabase 或将方法移至主窗体。

      【讨论】:

        【解决方案4】:

        它们是在Content 类而不是Form1 类中定义的

        试试下面的。

            public void button1_Click(object sender, EventArgs e)
            {
                var content = new Content();
                content.Split();
                content.AddtoDataBase();
            }
        

        此外,您目前已经定义了 Content 类,但没有定义它是 public、private 等,因此它将默认为 internal。

        最后,当您构建越来越多的代码时,您会发现在同一个文件中包含多个类将很难找到您的方法。尝试将它们分成不同的文件,通常是Content.cs 和Form1.cs

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-08-15
          • 2014-09-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多