Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在我的主窗体中使用其他窗体的方法?_C#_Forms_Methods - Fatal编程技术网

C# 如何在我的主窗体中使用其他窗体的方法?

C# 如何在我的主窗体中使用其他窗体的方法?,c#,forms,methods,C#,Forms,Methods,我想使用其他表单中的一些公共方法。我想知道是否有办法做到这一点,我试图将方法和表单公开,但当我试图将其称为另一种形式的方法时,它似乎什么都没有 这是我的主要表格: namespace GUI { public partial class frmPrincipal : Form { public frmPrincipal() { InitializeComponent(); } private

我想使用其他表单中的一些公共方法。我想知道是否有办法做到这一点,我试图将方法和表单公开,但当我试图将其称为另一种形式的方法时,它似乎什么都没有

这是我的主要表格:

namespace GUI
{
    public partial class frmPrincipal : Form
    {
        public frmPrincipal()
        {
            InitializeComponent();
        }

        private void categoriaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            frmCadastroCategoria f = new frmCadastroCategoria();
            f.ShowDialog();
            f.Dispose();
        }

        private void categoriaToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            frmConsultaCategoria f = new frmConsultaCategoria();
            f.ShowDialog();
            f.Dispose();
        }
这就是我试图调用的表单

    public void LocalizarCategoria()
    {
        frmConsultaCategoria f = new frmConsultaCategoria();
        f.ShowDialog();
        if (f.codigo != 0)
        {
            DALConexao cx = new DALConexao(DadosDaConexao.StringDeConexao);
            BLLCategoria bll = new BLLCategoria(cx);
            ModeloCategoria modelo = bll.CarregaModeloCategoria(f.codigo);
            txtCodigo.Text = modelo.CatCod.ToString();
            txtNome.Text = modelo.CatNome;
            alteraBotoes(3);
        }
        else
        {
            this.LimpaTela();
            this.alteraBotoes(1);
        }
        f.Dispose();
    }
我试着做一些事情,比如:

    {
      LocalizarCategoria()
    }

但是我不能,它只是找不到方法。

不要调用该方法,因为它会使表单依赖,而不必依赖。如果一个方法是另一种形式,那么它属于那里是有原因的

您可能想做的是将该方法移动到另一个位置(例如基类)

例如:

public partial class frmPrincipal : MyFormBase // inherit from your own base
{
    ...
}

public partial class frmMyOtherForm : MyFormBase // inherit from your own base
{
    ...
}

public class MyFormBase : Form  // your own base with the to be shared method
{
    protected void LocalizarCategoria() // protected might be enough
    {
        ...
    }
}

不要调用该方法,因为它会使表单依赖,而不必依赖。如果一个方法是另一种形式,那么它属于那里是有原因的

您可能想做的是将该方法移动到另一个位置(例如基类)

例如:

public partial class frmPrincipal : MyFormBase // inherit from your own base
{
    ...
}

public partial class frmMyOtherForm : MyFormBase // inherit from your own base
{
    ...
}

public class MyFormBase : Form  // your own base with the to be shared method
{
    protected void LocalizarCategoria() // protected might be enough
    {
        ...
    }
}

LocalizarCategoria
是一种实例方法(因为它不是
static
)。所以您需要另一个表单的实例,然后您可以这样调用它:

var myOtherForm = new frmOtherForm();
myOtherForm.LocalizarCategoria();
或者,如果
LocalizarCategoria
不需要访问任何实例字段、属性或方法,则可以将其设置为
静态

public static void LocalizarCategoria()
{
    // etc..
然后通过引用另一个窗体的类(而不是特定实例)调用它:


LocalizarCategoria
是一种实例方法(因为它不是
static
)。所以您需要另一个表单的实例,然后您可以这样调用它:

var myOtherForm = new frmOtherForm();
myOtherForm.LocalizarCategoria();
或者,如果
LocalizarCategoria
不需要访问任何实例字段、属性或方法,则可以将其设置为
静态

public static void LocalizarCategoria()
{
    // etc..
然后通过引用另一个窗体的类(而不是特定实例)调用它:


您需要创建要使用的
表单
对象的实例:

var form = new FormThatHasTheMethod_LocalizarCategoria();
form.LocalizarCategoria();

您需要创建要使用的
表单
对象的实例:

var form = new FormThatHasTheMethod_LocalizarCategoria();
form.LocalizarCategoria();


“我想使用其他表单中的一些公共方法。”-不要这样做,因为这会使表单依赖,尽管它们可能不依赖。如果一个方法是另一种形式,那么它就属于那里。您可能想做的是将方法移动到另一个地方(例如基类)。我同意@Quality Catalyst的评论,并建议您接受他的答案,而不是我的答案-在这种情况下,基类想法是一个更好的解决方案。现在还不完全清楚您想要做什么。但有两种明显的可能性,这两种可能性都在之前提出的问题中得到了很好的解决:并且(如果@Quality发布的答案解决了您的问题,那么您的问题就是这些链接中第二个的重复)。“我想使用其他表单中的一些公共方法。”-不要这样做,因为这会使表单依赖,尽管它们可能不依赖。如果一个方法是另一种形式,那么它就属于那里。您可能想做的是将方法移动到另一个地方(例如基类)。我同意@Quality Catalyst的评论,并建议您接受他的答案,而不是我的答案-在这种情况下,基类想法是一个更好的解决方案。现在还不完全清楚您想要做什么。但有两种明显的可能性,并且这两种可能性都通过之前提出的问题得到了很好的解决:和(如果@Quality发布的答案解决了您的问题,那么您的问题就是这些链接中第二个的重复)。可行的解决方案,但使表单相互依赖。我同意,这通常不是一个好的做法;然而,我认为OP需要这种情况。。。我个人会寻找一个更好的解决方案,可能是两种表单都可以使用的静态类,或者基类(如您所建议的),等等。可行的解决方案,但会使表单相互依赖;然而,我认为OP需要这种情况。。。我个人会寻找更好的解决方案,可能是两种表单都可以使用的静态类,或者基类(如您所建议的),等等。可行的解决方案,但会使表单相互依赖。可行的解决方案,OP发布的方法使用了两个字段,这两个字段几乎肯定特定于包含该方法的表单,并且调用了同一类中的两个其他方法,这两个方法中的任何一个都很容易需要相同表单的成员。OP将无法简单地将代码移动到基类中,而不移动大量其他成员(坦率地说,VS设计器无法很好地处理子类
表单
对象,因此这样做会带来许多其他麻烦)。是的,正确,这就解释了为什么它应该被从形式中带到一个更合适的地方。像这样的设计会带来长期的麻烦,需要更重的重新分解,因此首先要更好地设计和实施,这样你才能避免以后的返工。好吧,我不得不将20种方法用在另外20种形式中,我认为这样做效率不高,因此,我尝试跳出框框思考,并根据我的需要提出了另一个解决方案。但既然这看起来是最好的解决方案,我就把这个作为最好的答案。感谢您的努力和分享的知识。OP发布的方法使用了两个字段,这两个字段几乎肯定特定于包含该方法的表单,并且调用了同一类中的两个其他方法,其中任何一个都可能很容易需要同一表单的成员。OP将无法简单地将代码移动到基类中,而不移动大量其他成员(坦率地说,VS设计器无法很好地处理子类
表单
对象,因此这样做会带来许多其他麻烦)。是的,正确,这就解释了为什么它应该从形式中去掉,变成一个更合适的p