【问题标题】:How to access another class's method?如何访问另一个类的方法?
【发布时间】:2018-11-13 07:25:33
【问题描述】:

我有一个 WinForms 应用程序。在主窗体中,我编写了一个方法,该方法将清除作为参数传递的任何形式的所有文本框。我想从另一种形式调用这个方法。以下代码是我经过多次试验/错误并浏览此站点后得出的。每次单击新表单的全部清除按钮时都实例化主表单的新版本是一种好习惯吗?如果我要使用它自己的 clear all 按钮制作另一个表单,我将不得不通过类似的做法实例化一个新的主表单(除非我将方法设为静态)?任何人都可以建议从不同表单访问一个表单方法的替代方法吗?提前谢谢了。

编辑:我知道将方法设为静态将是一种简单有效的解决方案,但我对使用非静态方法感到好奇。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    public  void ClearAll(Form formToClear) //CLEAR TEXTBOXES
    {
        foreach (var box in formToClear.Controls.OfType<TextBox>())
        {
            box.Text = "";
        }
    }

 }

public partial class NewItemForm : Form
{
    public NewItemForm()
    {

        InitializeComponent();
    }

     private void clearAllButton_Click(object sender, EventArgs e)
    {
        Form1 mainForm=new Form1();
        mainForm.ClearAll(this);
    }
}

【问题讨论】:

  • 只需创建一个static 实用函数,它将清除Form 的TextBoxes
  • 这个方法必须是主窗体的成员有什么原因吗?为什么不单独的静态类?为什么不创建一个继承自 Form 的中间类,而所有其他的都将从该类继承?
  • 不,创建主窗体的新实例根本不是好主意。

标签: c# winforms methods


【解决方案1】:

您不必将 ClearAll 方法设为静态。如果您保持对主表单的全局引用就足够了。您可以在 Program.cs 中执行此操作。虽然这不是最好的方法。

static class Program {
    public static Form1 TheForm;

    [STAThread]
    static void Main() {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        TheForm = new Form1();
        Application.Run(TheForm);
    }
}

再来一次!仅仅因为它可以做到,并不意味着我会鼓励你这样做。这不符合 OOP 的精神。

如果您想要访问 Form1 的方法的唯一原因是清除 TextBoxes,那么我建议创建一个中间类:

public class InterForm : Form
{
    public void ClearAll() //CLEAR TEXTBOXES
    {
        foreach (var box in this.Controls.OfType<TextBox>())
        {
            box.Text = "";
        }
    }
 }

所有其他形式都应该继承自InterForm。

【讨论】:

  • 如何在 Program.cs 中放置全局引用?它会是什么样子?
  • 随样本更新。
【解决方案2】:

您可以在这里使用Event 的概念。

您要调用主表单方法的另一个表单表单应该有一个事件,

在创建此表单的实例时(我猜您只是从主表单创建此表单的实例),您可以将此表单的事件订阅到您的目标方法。

因此,当您需要调用主窗体的该方法时(从另一个窗体),您可以引发该事件。

参见下面的示例代码。

假设Form1 是你的主要表单

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    void f2_ClearTextBoxOfForm(Form targetForm)
    {
        foreach (Control control in targetForm.Controls)
        {
            if (control is TextBox)
                ((TextBox)control).Text = string.Empty;
        }
    }

    private void btnShowForm2_Click(object sender, EventArgs e)
    {
        Form2 f2 = new Form2();
        f2.ClearTextBoxOfForm += f2_ClearTextBoxOfForm;
        f2.Show();
    }
}

而Form2 是您要清除Form1 的所有文本框的另一个表单

public delegate void ClearTextBoxEventHandler (Form targetForm);
public partial class Form2 : Form
{
    public event ClearTextBoxEventHandler ClearTextBoxOfForm;
    public Form2()
    {
        InitializeComponent();
    }

    private void btnClearTextBox_Click(object sender, EventArgs e)
    {
        if (ClearTextBoxOfForm != null)
        {
            //here passing 'this' means we want to clear textBoxes of this form (Form2)
            //you can pass any Form's object of which you want to clear Textboxes
            ClearTextBoxOfForm(this);
        }
    }
}

【讨论】:

  • 它不是需要清除其文本框的主表单。
  • @Amit - 是的,但你的评论说“//在这里你可以清除主表单的文本框”。
  • @Enigmativity aah 是的,我应该更具体地传递表单和清除它们的文本框,我已经相应地更新了代码。谢谢。
【解决方案3】:

您几乎可以肯定地创建一个带有静态函数的静态实用程序类。这将通过防止创建不必要的Form1 实例来保留内存。根据 Form 类的大小和其中包含的对象/变量,创建一个新实例只是为了使用该类中的 1 个函数,最终可能会导致大量内存随着时间的推移而丢失。静态类中的静态方法可以防止这种情况发生,因为静态方法在进程的生命周期中只定义/实例化一次,而不是每个实例一次。

你可能应该使用类似的东西:

internal static class FormUtils
{
    internal static void ClearAllTextBoxes(Form form)
    {
        if (form == null)
            return;
        if (form.Controls.Count <= 0)
            return;
        foreach (var box in form.Controls.OfType<TextBox>())
        {
            box.Clear();
        }
    }
}

然后,该函数将像这样使用:

public partial class NewItemForm : Form
{
    public NewItemForm()
    {
        InitializeComponent();
    }

    private void clearAllButton_Click(object sender, EventArgs e)
    {
        FormUtils.ClearAllTextBoxes(this);
    }
}

【讨论】:

    猜你喜欢
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多