2016-11-29 23 views
2

我有一個對話窗口(只是一種形式)可以通過幾種形式調用的類。我希望這個對話的標題根據哪個表單調用而改變。如何找到以前表單的表單名稱?

在對話類中找到調用它的表單的表單名稱(不改變可以調用它的幾種表單的代碼)嗎?

+0

如果通過將主人叫對話框像這樣:'dialog.ShowDialog(owner);''你可以在對話框中使用'Owner.Title'。 –

+0

@PeterBons這確實需要改變OP不想要的幾種形式的代碼,但是如果調用不是這樣的話,那麼他應該改變它,因爲這是調用對話框形式的唯一正確方法 – GuidoG

+0

你試過Form .ActiveForm在對話框變爲活動狀態之前? – GuidoG

回答

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) ,但如果你不能真正改變調用形式,這種方法可能會很方便。

+0

這個工程,但有一個更簡單的方法來獲得父窗體,看到我的答案我在這裏提前一小時 – GuidoG

+0

@GuidoG所以?你比我早一個小時回答有什麼關係?答案完全不同。順便說一句,現在你說了,我的答案有用。我剛剛嘗試過你,並不適合我。 'Form.ActiveForm;'在我的示例應用程序中始終爲空。 – Pikoh

+0

發佈時間無關緊要。我的答案適用於我,我已經在MDI和非MDI中進行了測試。那麼,如果它不適合你,那麼你的示例應用程序是什麼類型的應用程序呢? – GuidoG

0

的FormCollection可以幫助你:

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

想象一下,你有** 10 **打開的表單(包括對話框),以及該對話框已經從第五個**彈出。你如何檢測感興趣的形式('Application.OpenForms [4]')?你可以很容易地列舉出所有的開放表格,但是你必須篩選出所需的表格,這是主要難點。 –

+0

感謝您的回覆,但我確實考慮過OpenForms屬性,但是,如Dmitry指出的那樣,我需要找到在多個表單可能打開時調用此對話的實際表單名稱。 – SiC99

0

你可以試試這個在dialogform,你一定要做這個dialogform變得活躍,以防止它發現自己之前。

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

    if (activeForm.IsMdiContainer && activeForm.ActiveMdiChild != null) 
    { 
     activeForm = activeForm.ActiveMdiChild; 
    } 
    return activeForm; 
} 
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; 
    } 
}