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でWinFormsDesignerを使用することをお勧めします。

また、.NETスタイルの規則に準拠する必要があることにも注意してください。クラスとパブリックメンバーはTitleCaseを使用し、名前空間内に存在する必要があります。(その名前を使用する場合は)に変更buttonsし、ブロックでラップします。Buttonsnamespace

于 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);
}

これは、クラス「ボタン」が 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 に対して直接行う場合と同様です。ご覧のとおり、ボタンが作成されて _form の Controls コレクションに追加される print() メソッドで、これが発生します。これは、Form1 内から Controls.Add を呼び出すのと同じです。

これはあなたにとって意味がありますか?

于 2012-09-04T18:11:44.833 に答える