控制不起作用

时间:2012-09-04 17:49:43

标签: c# controls

我已经添加了我的主类,我从中调用了按钮类,这就是打印出按钮的地方。代码正在编译好,但我看不到实际的按钮。在我看来,它没有继承控件属性。谢谢!

  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

2 个答案:

答案 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相同。

这对你有意义吗?