【问题标题】:How to access parent form?如何访问父表单?
【发布时间】:2013-09-02 13:56:07
【问题描述】:

好的,所以很多人都以一种或另一种方式问过这个问题,但除了在调用孩子时传递父对象之外似乎没有很多答案。问题是,我无法访问父代码。

这是我的情况。

一些我无法访问的代码,我只是使用了 dll(父表单),在我的代码(子表单)中调用了一个函数。

我的函数调用需要父表单作为参数之一的第 3 方 SDK(不是那么重要)。另外,我无法访问第 3 方代码,只能通过一些 c++ 库。

我的子窗体能否知道它的父窗体,或者它注定要成为孤儿?

【问题讨论】:

  • ParentForm 属性不适合您吗?
  • 或者FindForm()怎么样?
  • Parent form 到底是什么意思?如果您的子窗体有父窗体,则父窗体将包含它,这意味着子窗体无法移出Parent formBounds。我想你的意思是Owner form
  • @KingKing 有一个好点子。是您所追求的表单容器,还是所有者表单(这将是一个不同的窗口,并且始终显示在拥有的表单后面)

标签: c# winforms


【解决方案1】:

最一般的情况(因为您的表单位于 dll 中的某个位置,并且您必须将父表单传递给第 3 方软件)- WinAPI - 您可以使用 GetParent 检索父窗口句柄功能

http://msdn.microsoft.com/en-us/library/windows/desktop/ms633510(v=vs.85).aspx

类似的东西:

[DllImport("user32.dll",
           EntryPoint = "GetParent",
           CharSet = CharSet.Auto)]
internal static extern IntPtr GetParent(IntPtr hWnd); 

...

IntPtr parentHandle = GetParent(myForm.Handle); // <- If you have a form

...

IntPtr myFormHandle = ...
IntPtr myFormParentHandle = GetParent(myFormHandle); // <- If you have WHND only

// If there's a .net form with myFormParentHandle Handle you can retrieve it 
// Otherwise (e.g. form is not a .net one) you get null
Form parentForm = Control.FromHandle(myFormParentHandle) as Form;

【讨论】:

  • 这看起来可能是票。是否可以将此 intptr 转换回其对象?即,我能得到父表单吗?
  • @user1934821 是Form parent = (Form)Control.FromHandle(parentHandle)
【解决方案2】:

也许我遗漏了什么,但你可以使用ContainerControl.ParentForm

var parent = myForm.ParentForm;

或者(如果您实际上没有要查询的表单,而是有一个控件):

var parent = myForm.Parent;

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.parent.aspx

那么该父级的 Windows API 句柄将是:

IntPtr handle = parent.Handle;

您可以将其传递给您的 3rd 方 SDK。

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.handle.aspx

如果需要检查父级是否真的是一个Form:

Form form = myForm.Parent as Form;

if (form != null)
    // Do something with form.

但就像人们说的:你应该可以使用myForm.ParentForm

【讨论】:

  • TopLevel 为真时,表单的ParentParentForm 无用。默认情况下TopLevel 为真。我想你的意思是Owner
  • @SriramSakthivel OP 要求的是父表格而不是所有者?
  • 你能详细说明什么是父表单吗?它是如何养育的?问题对我来说还不清楚。 Parent Form 不清楚是没有意义的。 MDIParent 是有道理的,我错过了什么吗?
  • @UweKeim 安全需求差异并不重要。主要区别在于FindForm() 在表单没有父级时不返回 null。如果你需要知道表单没有父级,你应该调用ParentForm,而不是FindForm()
【解决方案3】:

您的表单是否出现在另一个表单之上?试试Form.Owner 属性。

您确定要这样做吗?您没有机会访问父表单可能有充分的理由。请注意不要通过规避此限制来破坏框架或模式。

【讨论】:

  • 是的,将一个遗留系统与另一个集成的缺点。 :(
【解决方案4】:

最好(为了您的心理健康)将所有需要的信息从父表单传递给子表单,这样您只需以一种方式思考(父表单将一些信息传递给子表单,子表单传递信息+更多)信息给下一个孩子等等)

做一个依赖于其他表单的表单/类称为硬耦合,这是维护软件的问题。

【讨论】:

  • 这不是一个选项,因为我无权访问父代码
猜你喜欢
  • 2014-09-05
  • 2011-06-30
  • 2014-09-19
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-28
  • 1970-01-01
相关资源
最近更新 更多