【问题标题】:Saving common methods?保存常用方法?
【发布时间】:2012-05-06 11:00:08
【问题描述】:

我有许多方法返回我为我的程序编写的 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)

现在,我不想以每种形式复制它们,而是想将它们写在其他文件中,并且仍然能够以我添加的任何新形式调用它们。有什么建议吗?

【问题讨论】:

  • 您可以创建一个静态类并在其中定义您的函数。但我不确定这是最好的模式。这些函数做什么
  • 旁注:我从未听说返回 void 的方法被称为“voids”。
  • 如前所述(我认为),我对此很陌生。这些功能只是创建具有特定图像、大小和位置的图片框。

标签: c# winforms


【解决方案1】:

好吧,其他人都对此有所尝试,我也不妨。 我认为已经提出了这个答案,但可能解释得不够清楚。

为您的项目添加一个新类 在 Visual C# 中你会去 项目 -> 添加类

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

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

然后在 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);

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

【讨论】:

  • 这实际上是迄今为止最解释的解决方案,我正在尝试,稍后会回答
  • '由于 Project.Tools.NewBtn(string,int,int) 返回 void,return 关键字后面不能跟对象表达式' -> 当我尝试输入“返回返回按钮" :/
  • @AntonioTehSumtin 正如我在上面的 cmets 中解释的那样,您必须将 void 更改为 Button 因为您需要返回一个按钮。仔细看上面的代码,注意声明 public static Button NewBtn。然后在方法开始时声明一个新按钮,对该按钮进行更改,然后将其发回。如果按钮需要基于现有按钮,您可以将 Button 发送到方法 public static Button NewBtn(Button template, string name, int locX, int locY)
  • 我对上面做了一些修改,以反映我认为你想要的,阅读 EDITED: 声明看起来你是在一个图片框而不是一个按钮之后,所以我将返回类型更改为图片框
  • 感谢您的努力,我会对此进行测试并报告我的结果:)
【解决方案2】:

你可以让他们extension methods

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,我想,但目的是什么?

【讨论】:

  • 目的是创建按钮并简单地编写它的坐标、大小和图像,而不是为每个按钮编写 5-6 行代码,因为我使用了许多不同的按钮 ^^
【解决方案3】:

我认为创建一个派生自 Form 的超类会更好,这样您就可以从它派生所有其他表单。虽然它可能有点棘手,但它是一个更好的架构解决方案:

  • 创建一个新类,比如说public class CommonForm : Form。不要使用Add new form,而是使用Add new class,以使其成为纯.cs 文件

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

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

【讨论】:

  • 建议怎么做? ^^'
【解决方案4】:

您可以做的是重构它们并将它们放入某种实用程序类中。由于您会将这些组件添加到其他控件,因此您可以将它们的签名重构为:

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 将创建一个新按钮。

另一方面,您也可以创建一个扩展 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);
}

【讨论】:

  • 我没办法让它工作,如果你请解释一下?
  • @AntonioTehSumtin:我已经编辑了我的答案,我想我不能比这更清楚了。
【解决方案5】:

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

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

您选择哪一种取决于您要实现的方法。如果您想更改表单(创建按钮等),我会选择继承。

【讨论】:

  • 所以你建议我在同一页面上制作多个表单?
  • @AntonioTehSumtin 我建议进行继承。因此,您可以从基本形式继承并在每个新形式上使用这些函数。如果您更改基本表单,这些更改也会在其他表单中发生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
  • 1970-01-01
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多