一般按钮

时间:2013-03-05 17:22:28

标签: c# winforms

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

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

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

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

//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与此处引用的不同。

有人理解我要做的事吗?

3 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

为什么不在Clear公开中设置Form2功能,然后执行:

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

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

if(this.ActiveMDIChild != null)
   Clear(this.ActiveMDIChild);

答案 2 :(得分: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();
    }
}

我希望它能解决你的问题。干杯队友!