我有很多方法可以返回我在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)
现在,我不想在每种形式中复制它们,而是想在其他文件中编写它们,并且仍然能够以我添加的任何新形式调用它们。建议?
答案 0 :(得分:1)
好的,其他人也为此拍摄了我也可能。 我认为这个答案已被提出,但可能没有得到足够的解释。
为您的项目添加一个新类 在Visual C#中你会去的 项目 - >添加类
为您的班级命名,然后点击添加
通常我将此类命名为Tools
然后在Tools.cs文件中
EDITED: 我正在查看你的其他一些问题,我想我找到了你想要实现的实际方法。正如有人在该线程中评论过你真的需要使用更好的名字,我已经对方法进行了更改,希望能够模拟你的目标。如果有人想要了解这一点,请参阅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);
我没有编译或测试它无论如何,可能有一个错字,请让我知道是否有明显的东西,所以我可以编辑错误
答案 1 :(得分:0)
你可以制作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, ...)
。
但是,我实际上质疑这些功能的使用......他们实际上做了什么?我想,创建新的Button
和PictureBox
es,但目的是什么?
答案 2 :(得分: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
将创建一个新按钮。
另一方面,您还可以创建一个扩展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);
}
答案 3 :(得分:0)
我认为创建一个派生自Form的超类会更好,这样你就可以从中派生出所有其他形式。虽然它可能有点棘手,但它是一个更好的架构解决方案:
创建一个新类,假设为public class CommonForm : Form
。不要使用Add new form
,而是使用Add new class
才能使其成为纯.cs文件
在该课程中实施常用方法
创建新表单时,请转到源代码并手动添加: CommonForm
以从这个新类派生它们
答案 4 :(得分: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);
}
}
您选择哪一个依赖于您要实施的方法。如果你想改变表格(创建按钮等),我会选择继承。