如何找到上一个表单的表单名称?

时间:2016-11-29 08:12:07

标签: c# winforms

我有一个对话窗口(只是一个表单)类,可以通过多种形式调用。我希望这个对话的标题取决于所谓的形式。

在对话课中是否有办法找到调用它的表单的表单名称(不改变可以调用它的几种表单的代码)?

4 个答案:

答案 0 :(得分:1)

我只是用一个简单的例子尝试过它,但使用GetWindowLongPtr你可以获得对话框的父窗体。 首先,您必须在对话框中添加此定义:

[DllImport("user32.dll", EntryPoint = "GetWindowLong")]
static extern IntPtr GetWindowLongPtr(IntPtr hWnd, GWL nIndex);

public enum GWL
{
    GWL_WNDPROC = (-4),
    GWL_HINSTANCE = (-6),
    GWL_HWNDPARENT = (-8),
    GWL_STYLE = (-16),
    GWL_EXSTYLE = (-20),
    GWL_USERDATA = (-21),
    GWL_ID = (-12)
}

然后,在对话框中,您可以执行此操作:

private void Form2_Load(object sender, EventArgs e)
{
    IntPtr parentHandle = GetWindowLongPtr(this.Handle, GWL.GWL_HWNDPARENT);
    FormCollection fc = Application.OpenForms;
    foreach (Form frm in fc)
    {   
        if (frm.Handle==parentHandle)
        {
            Console.WriteLine(frm.Name); //this is your parent form
        }

    }
}

无论如何,我认为调用ShowDialog(this)更容易,但如果你无法真正改变调用形式,这种方法可能很方便。

答案 1 :(得分:0)

FormCollection可以帮助您:

FormCollection fc = Application.OpenForms;
foreach (Form frm in fc)
{
    MessageBox.Show(frm.Name.ToString());
}

答案 2 :(得分:0)

您可以在dialogform上尝试此操作,确保在dialogform变为活动状态之前执行此操作以防止它自行查找。

public Form GetActiveForm()
{
    Form activeForm = Form.ActiveForm;

    if (activeForm.IsMdiContainer && activeForm.ActiveMdiChild != null)
    {
        activeForm = activeForm.ActiveMdiChild;
    }
    return activeForm;
}

答案 3 :(得分:0)

假设您正在从主窗体创建其他对话框(窗体),您可以执行以下操作:

public partial class MyForm : Form
{
    //Some code
    public void OpenDialog_Click(...)
    {
        MyOtherForm form = new MyOtherForm();
        form.Parent = this;
        form.ShowDialog();
    }
}

和你的第二种形式:

public partial class MyOtherForm : Form
{
    public MyOtherForm()
    {
        var parent = this.Parent as Form;
        if(parent != null)
            this.Title = parent.Title;
    }
}