0

我有许多方法返回我为我的程序编写的 C# 形式的 void,我一直使用这些方法。由于我需要在多个表单上使用它们,我认为必须有更好的方法将它们保存在某个 Class、Data 中,而不是为每个表单单独复制它们......我对此很陌生,所以我正在寻找建议。该怎么办?

示例:我创建了类似于以下的方法:

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# 中为您的项目添加一个新类,您将使用 Project -> add Class

给你的班级起个名字,然后点击添加

通常我把这个类命名为工具

然后在 Tools.cs 文件中

已编辑:我正在查看您的其他一些问题,我想我找到了您尝试实施的实际方法。正如有人在该线程中评论的那样,您确实需要使用更好的名称,我已经对该方法进行了更改,以希望模拟您的目标。对于任何试图理解这一点的人,请参阅C# graphics,paint,picturebox centering

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

现在以您的一种形式

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

或 PictureBox myButton=Tools.NewBtn("btn1",200,200);

无论如何我都没有编译或测试它,可能有错字,如果有明显的地方请告诉我,以便我可以编辑错误

于 2012-05-08T11:55:41.407 回答
0

一种方法是继承基本形式:

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

第二种方法是创建一个包含函数的静态类:

  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 回答
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, ...).

但是,我实际上是在质疑这些功能的使用......它们实际上是做什么的?我想,创造新Button的 s 和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将创建一个新按钮。

另一方面,您还可以创建一个扩展 aForm并包含以下方法的类:

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 form,而是Add new class为了使其成为纯 .cs 文件

  • 在该类中实现您的常用方法

  • 创建新表单时,转到源代码并手动添加: CommonForm以从这个新类派生它们

于 2012-05-06T11:46:09.057 回答