1

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

  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
4

2 回答 2

1

你的类buttons不是子类,System.Windows.Forms.Control所以它没有this.Controls成员。

我建议在 VS 中使用 WinForms 设计器,而不是手动创建自己的表单或控件,至少在您是初学者的时候。

我还注意到您应该遵守 .NET 样式约定。类和公共成员应该使用 TitleCase 并且应该存在于命名空间中。更改buttonsButtons(如果您想使用该名称)并将其包装在一个namespace块中。

于 2012-09-04T17:51:36.177 回答
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);
}

是因为“按钮”类没有定义控件集合,也没有从公开控件集合的类继承。例如,如果您要这样做:

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 因此,您对变量 _form 执行的任何操作都与您直接对 Form1 执行的操作一样。如您所见,这就是 print() 方法中发生的情况,在该方法中创建了一个按钮,然后将其添加到 _form 的 Controls 集合中,这与从 Form1 中调用 Controls.Add 相同。

你能理解这个吗?

于 2012-09-04T18:11:44.833 回答