0

私はいつも使っているC#形式でプログラム用に書いたボイドを返すメソッドをたくさん持っています。複数のフォームで使用する必要があるため、フォームごとに個別にコピーするのではなく、クラス、データに保存する方がよいと思います。これはまったく新しいので、アドバイスを探しています。何をすべきか?

サンプル:次のようなメソッドを作成しました。

private void NewBtn(string nName, int locX, int locY)
private void NewPic(string nName, int locX, int locY, int SizX, int SizY, Image Img)

さて、すべてのフォームでそれらをコピーする代わりに、他のファイルにそれらを書き込み、それでも私が追加した新しいフォームでそれらを呼び出すことができるようにしたいです。提案?

4

5 に答える 5

1

さて、他のみんなもこれを撃ちました。私もそうかもしれません。この答えは提案されていると思いますが、十分に明確に説明されていない可能性があります。

Visual C#でプロジェクトに新しいクラスを追加します。[プロジェクト]->[クラスの追加]に移動します。

クラスに名前を付けて、[追加]をクリックします

通常、私はこのクラスにToolsという名前を付けます

次に、Tools.csファイル内

編集:私はあなたの他の質問のいくつかを見ていました、そして私はあなたが実装しようとしている実際の方法を見つけたと思います。誰かがそのスレッドであなたが本当により良い名前を使う必要があるとコメントしたので、私はあなたが何をしようとしているのかをうまくシミュレートするためにメソッドに変更を加えました。これを理解しようとしている人は、C#グラフィック、ペイント、ピクチャーボックスのセンタリングを参照してください。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace MyNameSpace //Make sure this matches your projects namespace
{
    class Tools
    {
        //Because this is outside the form that is calling it, you cannot access
        //the actual form or panel where you wish to place the button(PictureBox)
        //so instead of returning void (which is nothing) we return the newly
        //created Button(PictureBox)



        public static PictureBox NewBtn(string nName, int locX, int locY)
        {
            Font btnFont = new Font("Tahoma", 16);
            PictureBox S = new PictureBox();
            //You need to specify a size for your pictureBox
            S.Width=100;
            S.Height=100;

            S.Location = new System.Drawing.Point(locX, locY);
            S.Paint += new PaintEventHandler((sender, e) =>
            {
                var size = g.MeasureString(Name, btnFont);
                e.Graphics.DrawString(Name, btnFont, Brushes.Black,
                  (S.Width - size.Width) / 2,
                  (S.Height - size.Height) / 2));
            }
            return S;
         }
    }
}

今あなたのフォームの1つで

Panel1.Controls.Add(Tools.NewBtn("btn1",200,200));

またはPictureBoxmyButton= Tools.NewBtn( "btn1"、200,200);

私はこれをコンパイルしたりテストしたりしませんでした。タイプミスがあるかもしれません。何か明らかなことがあれば教えてください。エラーを編集できます。

于 2012-05-08T11:55:41.407 に答える
0

それらを拡張メソッドにすることができます、

static class FormExtensions {
    public static void NewBtn(this Form form, string nName, int locX, int locY) { ... }
}

Formそのため、フォーム自体で宣言されているかのように、どのようなものからでも呼び出すことができます。

または、それらをヘルパークラス(たとえば)に追加して、 -FormHelpersのパラメーターを追加することもできます。Form

public void NewBtn(Form form, string nName, int locX, int locY) { ... }

次に、を介してそれらを使用しますFormHelpers.NewBtn(this, ...)

しかし、私は実際にこれらの関数の使用に疑問を持っています...それらは実際に何をしますか?新しいButtonsとPictureBoxesを作成すると思いますが、どのような目的で使用しますか?

于 2012-05-06T11:04:25.760 に答える
0

あなたができることは、それらをリファクタリングして、ある種のユーティリティクラスに入れることです。これらのコンポーネントを他のコントロールに追加するので、それらのシグネチャを次のようにリファクタリングできます。

public FormUtilClass
private void NewBtn(string nName, int locX, int locY, Control parentControl)

これを行うと、Formクラスから次のようになります。

public class MyForm : Form
...
FormUtilClass formUtil  = new FormUtilClass();
formUtil.NewBtwn("someName", 0, 0, this);

前提はNewBtn、新しいボタンを作成することです。

一方、aを拡張し、Form次のメソッドを含むクラスを作成することもできます。

public class MyForm : Form
private void NewBtn(string nName, int locX, int locY)
{
     Button btn = new Button();
     ...
     this.Controls.Add(btn);
}

そして、独自のフォームを作成するときは、後者のクラスから拡張するだけです。

public class MyNewForm : MyForm
{
    this.NewButton("someName", 0, 0);
}
于 2012-05-06T11:04:58.797 に答える
0

Formから派生したスーパークラスを作成して、他のすべてのフォームをそこから派生できるようにする方がよいと思います。少し注意が必要な場合もありますが、より優れたアーキテクチャソリューションです。

  • たとえば、新しいクラスを作成しますpublic class CommonForm : Form。使用しないでくださいAdd new formAdd new class、純粋な.csファイルにするためです

  • そのクラスに共通のメソッドを実装する

  • 新しいフォームを作成するときは、ソースコードに移動し、手動で追加: CommonFormして、この新しいクラスからフォームを派生させます

于 2012-05-06T11:46:09.057 に答える
0

1つの方法は、基本フォームを継承することです。

 public partial class BaseForm: Form
    {
private void NewBtn(string nName, int locX, int locY)
{
//Your Action
}
private void NewPic(string nName, int locX, int locY, int SizX, int SizY, Image Img)
{
//Your Action
}
}

public partial class SecondForm: BaseForm
    {
public SecondForm()
        {
NewPic(Parameters);
}
}

2番目の方法は、関数を含む静的クラスを作成することです。

  public static class FunctionClass
        {
    private void NewBtn(string nName, int locX, int locY)
    {
    //Your Action
    }
    private void NewPic(string nName, int locX, int locY, int SizX, int SizY, Image Img)
    {
    //Your Action
    }
    }

public partial class SecondForm: Form
        {
    public SecondForm()
            {
   FunctionClass.NewBtn(Arguments);
    }
    }

どちらを選択するかは、実装するメソッドによって異なります。フォームを変更したい場合(ボタンの作成など)、継承を選択します。

于 2012-05-06T12:41:03.023 に答える