3

我已经把头发拉了一段时间

我创建了一个充满图片框的表单。每个图片框将包含一个_click、_mousedown 和_mouseup 事件。我希望将这些为表单创建的事件移动到 class1.cs 中,然后让 form1.cs 继承这些事件。

我不想公开picturebox1。所以诸如 Class1 classOne = new Class1(); pictureBox1.Click += new EventHandler(cs.pictureBox1_Click); 不管用。

我不确定如何让 form1.cs 继承 class1.cs。在我的脑海里听起来很容易,但我只是在精神空白

我已经厌倦了 Form1 类:Form, Class1

在 Form1.Designer.cs 中 this.pictureBox1.Click += new System.EventHandler(this.pictureBox1_Click); this.pictureBox1_Click 无法访问

如果你能指出我正确的方向,那将是一个很大的帮助!干杯

Form1.cs
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
}

Class1.cs 
class Class1
{

    private void pictureBox1_Click(object sender, EventArgs e)
    {
        MessageBox.Show("pb1 click");
    }
 }
4

7 回答 7

3

继承定义了“is-a”关系,因此除非 Form1Class1,否则您没有以正确的方式处理此问题。根据您要设计的内容,您确实有几个选择:

  1. 通过公共方法将表单传递给类实例,并让类附加事件处理程序(如果有多个共享行为的表单,这在这些情况下似乎更有意义)。

  2. 将常见行为存储在表单本身中(作为一种特殊类型的表单,PictureClickingForm),然后让其他表单继承。现在可以保护方法。

这是一个继承与包容的问题。当以这种方式表达问题时,有关此的更多信息。

于 2012-04-19T01:24:24.693 回答
2

Class1应该继承自Form,然后Form1将继承自Class1

class Class1 : Form
{
    //...
}

public partial class Form1 : Class1
{
    //...
}

确保所有partial声明都继承自Class1而不是继承自Form. (这可能会为任何自动生成的代码添加一个额外的步骤,这是类的经典原因partial。您可能需要为此编写自己的自动化。)

我不清楚的是你试图通过在Formand之间使用中间类型来实现什么Form1。应该是Class1多个表单将继承的通用“基本表单”吗?或者你正在尝试做其他事情?但是,如果您希望Form1能够访问成员Class1而不将其公开为public成员,则可以protected改为创建它们。

于 2012-04-19T01:24:16.293 回答
1

只有通过如下更改 Class1.cs 才能实现它

public partial class Form1
{
    private void pictureBox1_Click(object sender, EventArgs e)
    {
        MessageBox.Show("pb1 click");
    }
 }
于 2012-04-19T01:24:36.037 回答
0

您想订阅Form1来自 的事件Class1吗?尝试这样的事情:

//Form1.cs
public partial class Form1 : Form
{
    Class1 class1;

    public Form1()
    {
        InitializeComponent();
        class1 = new Class1();
        this.pictureBox1.Click += new EventHandler(class1.pictureBox1_Click); 
    }
}

//Class1.cs 
class Class1
{

    private void pictureBox1_Click(object sender, EventArgs e)
    {
        MessageBox.Show("pb1 click");
    }
}

看起来您尝试做的不是继承,而是简单地将 GUI 事件通知给外部对象。你应该重新评估你的代码,想想你正在尝试什么。

于 2012-04-19T01:24:23.070 回答
0

您的 Form1 是一个类,因此只需从 Form1 继承 Form2。(而不是试图将部分复制回一些新的 Class1.cs 文件)Form1.designer.cs 仍然是 Form1 定义的一部分,只是为了图形表单设计器的目的而被移到一边。但请注意,定义中没有其他部分(即使是设计师也没有!我都在里面!)。

此外,您不必公开这些类以使同一程序集内部可以访问图片框。

选项:您可以在 Form1 中创建自己的事件,也可以使用 Form2 之类的子类创建处理 Form1 事件发生的方法abstractvirtual

这有帮助吗?

于 2012-04-19T01:28:18.373 回答
0

您始终可以使用接口。关键是你只能从一个类继承,但有很多接口......所以我假设你需要这样一个接口——通过方法或其他方式传递方法。远离接口,您始终可以将您的类作为第二类 Form 的构造函数的参数(使用 'this' 关键字),这样您就可以将值、方法从以前的 Form 传递给另一个(例如事件)。

于 2013-10-01T14:57:55.497 回答
0

您不需要公开图片框本身,但您需要公开 Class1 中的事件处理程序,以便可以在其他地方访问它们。

我真的看不出你应该在这里特别要求继承的理由。在这里查看更多信息。

于 2012-04-19T01:22:12.703 回答