我已经添加了我的主类,我从中调用了按钮类,这就是打印出按钮的地方。代码正在编译好,但我看不到实际的按钮。在我看来,它没有继承控件属性。谢谢!
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Windows;
//main class
namespace Test
{
public partial class Form1 : Form
{
buttons button1;
public Form1()
{
InitializeComponent();
print_button();
}
private void print_button()
{
button1 = new buttons();
button1.print();
}
}//form
}//test
//---------------------------------------------------------------//
//buttons class
namespace Test
{
public class buttons : System.Windows.Forms.Control
class buttons
{
private Button button1;
public buttons()
{
}
public void print()
{
button1 = new Button();
button1.Location = new System.Drawing.Point(82, 44);
button1.Size = new System.Drawing.Size(977, 54);
button1.Text = "next";
Controls.Add(button1);
}
}//class
}//test
答案 0 :(得分:1)
您的班级buttons
不是System.Windows.Forms.Control
的子类,因此它没有this.Controls
成员。
我建议使用VS中的WinForms Designer,而不是手工创建自己的表单或控件,至少在你是初学者的时候。
我还注意到你应该遵守.NET样式约定。类和公共成员应该使用TitleCase,并且应该存在于命名空间中。将buttons
更改为Buttons
(如果您要使用该名称)并将其包装在namespace
块中。
答案 1 :(得分:1)
我不知道你要用你提供的代码完成什么。无论如何,这种方法不起作用的原因是:
public void print()
{
button1 = new Button();
button1.Location = new System.Drawing.Point(82, 44);
button1.Size = new System.Drawing.Size(977, 54);
button1.Text = "next";
Controls.Add(button1);
}
是因为类'buttons'没有定义Controls集合,也没有从暴露控件集合的类继承。例如,如果你这样做:
public class buttons : System.Windows.Form
{
...
}
您的代码至少会编译,因为Form类公开了Controls集合。虽然这个解决方案可能不适合您的需求,但您要完成的工作并不完全明显。发布适当的更多信息,我会竭尽所能为您提供帮助。
- - - - 修改
您似乎正在尝试从上面的一条评论中重构您的Form1类。
你可以这样做:
public class Form1 : Form
{
public void foo()
{
Controls.Add(buttons.print());
}
}
并将您的按钮类修改为:
public class buttons
{
public static Button print()
{
Button btn = new Button();
btn.Location = new System.Drawing.Point(82, 44);
btn.Size = new System.Drawing.Size(977, 54);
btn.Text = "next";
return btn;
}
}
这将在调用主窗体的控件集合后添加一个按钮。正如所写,虽然这种方法没用,因为它只能反复生成相同的按钮。我会修改方法,使其看起来像这样
public static Button print(Point buttonLocation, Size buttonSize, string buttonText)
{
Button btn = new Button();
btn.Location = buttonLocation;
btn.Size = buttonSize;
btn.Text = buttonText;
return btn;
}
然后主要表单如下:
public void foo()
{
Controls.Add(buttons.print(new System.Drawing.Point(82, 44), new System.Drawing.Size(977, 54), "button text"));
}
这有帮助吗?
---编辑2 ---
我提供此编辑作为严格的学术范例,说明如何根据评论中的OP请求保持您的主要课程(表格)“更清洁”。我不建议在生产中使用此方法,而是建议使用MVC,MVP或MVVP等模式。我在这里排除了这些模式的例子,因为我认为它们在这个时间点超过了OP的技能水平,只会导致更多的混乱。
请考虑以下事项:
public class buttons
{
private Form _form = null;
public buttons(Form form)
{
_form = form;
}
public void print(Point buttonLocation, Size buttonSize, string buttonText)
{
Button btn = new Button();
btn.Location = buttonLocation;
btn.Size = buttonSize;
btn.Text = buttonText;
_form.Controls.Add(btn);
}
}
public class Form1 : Form
{
private buttons _buttons = null;
public Form1()
{
_buttons = new buttons(this);
}
public void foo()
{
buttons.print(new System.Drawing.Point(82, 44), new System.Drawing.Size(977, 54), "button text");
}
}
现在发生了什么:当Form1被实例化时,它创建了一个按钮类的新实例,并将其自身的引用传递给按钮构造函数(_buttons = new buttons(this))内部按钮类将此引用设置为因此,对变量_form所做的任何事情就好像你直接对Form1做的那样。正如您所看到的那样,print()方法中创建了一个按钮,然后将其添加到_form的Controls集合中,这与从Form1中调用Controls.Add相同。
这对你有意义吗?