0

我正在开发一个应用程序,我想包含一些全局功能,例如适用于应用程序包含的每个表单的几个按钮。

它是一个包含四个子窗体的 MDI 应用程序,每个窗体执行不同的任务,每个窗体都有自己的控件。我在每个表单上都有一个清除和搜索按钮,我想做的是创建两个全局按钮,为当前处于活动状态的表单执行这些操作。

例如,Form1 是 MDI 父级,Form2 是 Form1 的子级。我从 Form1 中的 ToolStripMenuItem 调用 Form2,我在 Form2 中有一个按钮,用于清除其中的所有文本框。我想要实现的是将此按钮中的代码移动到放置在 Form1(MDI 父级)的常规栏中的按钮,以便不仅清除 Form2 的文本框,而且清除我的应用程序中的所有表单。

这是我到目前为止所得到的:

//Form1 code
public partial class FrmPrincipal : Form
{
    public FrmPrincipal()
    {
        InitializeComponent();
    }
    private void manageUsersToolStripMenuItem_Click(object sender, EventArgs e) //Calling Form2
    {
        FrmUserManager frmusers = new FrmUserManager();
        frmusers.MdiParent = this;
        frmusers.Show();

    }
}

//Form2 code
public partial class FrmUserManager : Form
{   
    public FrmUserManager()
    {
        InitializeComponent();
    }
}

private void BtnClear_Click(object sender, EventArgs e)
{
    Clear(this);
}

private void Clear(Control all)
{
    foreach (Control all in all.Controls)
    {
        if (all is TextBox) ((TextBox)all).Text = string.Empty;
        if (all is CheckBox) ((CheckBox)all).Checked = false;
        if (all is DataGridView) ((DataGridView)all).DataSource = null;
        if (all.Controls.Count > 0) Clear(all);
    }
}

所以,基本上我想要的是将此代码移动到 Form1 中的一个按钮,以便从 Form2 外部执行此操作。如果我能做到,我将能够摆脱四个子表单(搜索和清除)中的按钮,并且应用程序将更易于使用。

我想到的唯一方法是将Form2中每个控件上的属性“Modifiers”更改为“public”,以尝试从Form1访问它们,执行以下操作:

Form2 frm2 = new Form2();
if(frm2.Active == true) Clear(this);

在这种情况下,我会实例化每个表单并验证它是否处于活动状态。

它没有显示任何错误,但仍然无法正常工作。我想我知道为什么,为调用 Form2 而创建的对象与此处创建的对象完全不同,因此当前显示的 Form2 与此处引用的对象不同。

有谁明白我想要做什么?

4

3 回答 3

0

这些是我为解决此问题而采取的步骤。

1. 创建继承自 Form 并具有公共 ClearData() 方法的类。

public class ClearableForm : Form
{
    public void ClearData()
    {
        Action<Control> traverseControls = null;

        traverseControls = (c) =>
        {
            if (c is TextBox) ((TextBox)c).Text = string.Empty;
            if (c is CheckBox) ((CheckBox)c).Checked = false;
            if (c is DataGridView) ((DataGridView)c).DataSource = null;
            c.Controls.Cast<Control>().ToList<Control>().ForEach(traverseControls);
        };

        traverseControls(this);
    }
}

2. 使您的 FrmUserManager 继承自 ClearableForm。

public partial class FrmUserManager : ClearableForm
{
    public FrmUserManager()
    {
        InitializeComponent();
    }
}

3. 使用以下代码将“Clear” ToolStripMenuItem 添加到 FrmPrincipal 表单上的 MenuStrip。

private void clearToolStripMenuItem_Click(object sender, EventArgs e)
{
    foreach (Form mdi_child in this.MdiChildren)
    {
        if (mdi_child is ClearableForm)
            mdi_child.ClearData();
    }
}

我希望它能解决你的问题。队友的欢呼声!

于 2013-03-05T18:55:51.743 回答
0

创建子表单时,您必须跟踪它。你可能想做这样的事情:

// In the MDI form    
List<Form> mChildForms = new List<Form>();

void ToolStripButton_Click(object sender, EventArgs args)
{
   Form myForm = new FrmUserManager();
   ...
   mChildForms.Add(myForm);
}

void BtnClear_Click(object sender, EventArgs args)
{
   foreach (Form f in mChildForms)
      if (f.Active)
         Clear(f);
}

可能不准确,我现在没有 Visual Studio。

于 2013-03-05T17:27:42.497 回答
0

你为什么不公开设置你的Clear功能Form2,然后做:

if(frm2.Active == true) frm2.Clear(frm2);

或者,如果您想对任何表单使用此功能,清除活动表单,只需将Clear功能移动到Form1,然后执行以下操作:

if(this.ActiveMDIChild != null)
   Clear(this.ActiveMDIChild);
于 2013-03-05T17:31:36.297 回答