我已经把头发拉了一段时间
我创建了一个充满图片框的表单。每个图片框都包含一个_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");
}
}
答案 0 :(得分:3)
继承定义了'is-a'关系,所以除非Form1 是-a Class1,否则你不会以正确的方式接近它。根据你想要设计的内容,你真的有几个选择:
通过公共方法将表单传递给类实例,让类附加事件处理程序(如果有多个共享行为的表单,这似乎在这些情况下更有意义。)
在表单中存储常见行为(作为特殊类型的表单PictureClickingForm
),然后让其他表单继承该行为。现在可以保护方法。
这是继承与遏制的问题。当以这种方式表达问题时,有关此问题的更多信息。
答案 1 :(得分:2)
Class1
应继承自Form
,然后Form1
将继承自Class1
:
class Class1 : Form
{
//...
}
public partial class Form1 : Class1
{
//...
}
确保所有partial
声明都从Class1
继承,而不是从Form
继承。 (这可能会为任何自动生成的代码添加额外的步骤,这是partial
类的经典原因。您可能需要为此编写自己的自动化。)
我不清楚您要通过在Form
和Form1
之间设置中间类型来实现的目标。 Class1
应该是多个表单将继承的通用“基本表单”吗?或者你想尝试别的什么?但是,如果您希望Form1
能够访问Class1
成员而不将其作为public
成员公开,则可以改为protected
。
答案 2 :(得分:1)
只有这样才能通过更改Class1.cs来实现它
public partial class Form1
{
private void pictureBox1_Click(object sender, EventArgs e)
{
MessageBox.Show("pb1 click");
}
}
答案 3 :(得分:0)
您不需要将Picture Box本身公开,但您需要在Class1中公开事件处理程序,以便可以在其他地方访问它们。
我真的没有理由要在这里明确要求继承。请查看here以获取更多信息。
答案 4 :(得分: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事件的外部对象。您应该重新评估您的代码,考虑完全您正在尝试做什么。
答案 5 :(得分:0)
您的Form1是一个类,所以只需从Form1继承Form2。 (而不是尝试将部件复制回一些新的Class1.cs文件)Form1.designer.cs仍然是Form1定义的一部分,只是为了图形表单设计器的目的而移到一边。但请注意,定义中没有其他部分(即使是设计师也没有!我就在那里!)。
此外,您不必将类公开,以使图片框可在内部访问同一个程序集。
选项:您可以在Form1中创建自己的事件,或者您可以使用类似Form2的子类创建abstract
或virtual
方法来处理Form1的事件发生。
这有帮助吗?
答案 6 :(得分:0)
您可以始终使用接口。关键是你只能从一个类继承,但是很多接口......所以我假设你需要这样的接口 - 传递方法或者其他什么。远离接口,你总是可以将你的类作为参数放到第二个类Form的构造函数中(使用'this'关键字),这样你就可以传递值,从以前的Forms中获取的方法可以说是另一个(例如也是事件)。