我有一个对话窗口(只是一个表单)类,可以通过多种形式调用。我希望这个对话的标题取决于所谓的形式。
在对话课中是否有办法找到调用它的表单的表单名称(不改变可以调用它的几种表单的代码)?
答案 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;
}
}