Winforms Vc++;,通过调用

Winforms Vc++;,通过调用,winforms,c++-cli,Winforms,C++ Cli,我一直在到处寻求帮助。到目前为止,我还没有找到我需要的帮助 我希望你们能指导或帮助我=) 我有一个Form1,在Form1上,我在Form1.h中包含了第二个forms文件:Form2.h 现在我创建了一个按钮,当按下按钮时运行: |表格1.h| Form2^frmprolog=gcnewform2(); frmProSog->ShowDialog() 现在Form2已经打开,我使用它在datagrid中搜索字符串。选择结果后,我将单击Form2中的一个按钮,我希望调用Form1中的一个函数,该

我一直在到处寻求帮助。到目前为止,我还没有找到我需要的帮助

我希望你们能指导或帮助我=)

我有一个Form1,在Form1上,我在Form1.h中包含了第二个forms文件:Form2.h 现在我创建了一个按钮,当按下按钮时运行:

|表格1.h| Form2^frmprolog=gcnewform2(); frmProSog->ShowDialog()

现在Form2已经打开,我使用它在datagrid中搜索字符串。选择结果后,我将单击Form2中的一个按钮,我希望调用Form1中的一个函数,该函数将在Form1中的另一个datagrid中添加数据

我试图在Form2中包含Form1.h,但我得到一个错误:无法使用给定的参数列表调用参数类型为:(System::Object^)

我希望有人能帮助我。尝试了许多关于STACKOFFER的建议,提醒了这个问题,但没有运气。

< P>(David Yaw的评论是正确的,我写下的是,OP可能需要更明确的指令。这个答案只是指出了通常的C++技术,而不是特别针对CLI/C++或WiFrm的东西)。 从您的描述中,我认为按钮按下事件函数的主体必须位于相应的头文件中。此外,
#include“Form1.h”
在Form2.h中,反之亦然:这会导致循环依赖和相关的痛苦

简单的修复方法是在Form1.cpp和Form2.cpp源文件中实现事件处理方法。表单设计器创建空方法后

public ref class Form 1 : System::Windows::Forms::Form
{

     private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
     {

     }
}
。。。然后从标头中删除实现

public ref class Form 1 : System::Windows::Forms::Form
{

     private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) ;
}
复制/粘贴到cpp文件中,并添加处理程序主体

System::Void Form1::button1_Click(System::Object^  sender, System::EventArgs^  e) {
    Form2^ frmProSog = gcnew Form2(); 
    frmProSog->ShowDialog();
}
从.h中删除相应的
#include
,并将其放入.cpp中

(如果有
Form1
的成员是
Form2^
,则在Form1.h中向前声明
Form2


上述方法可行,因为根据您的问题,Form2中的Form1或Form1中的Form2没有视觉表示(即在表单设计器中)。在这种情况下,只要在*.h中进行转发声明,并且在源文件中仅“使用”(访问成员等)循环依赖类,表单/控件之间就可以有任意多的循环依赖关系。您可以通过前向声明将句柄(^)带到Form1.h中的Form2,包括
Form2^
作为成员函数和方法签名。

您在这些类之间创建了循环依赖关系。Form1需要知道Form2是什么样子。现在Form2需要知道Form1是什么样子。这在C++语言中是不可能处理的,但它确实不容易。Winforms项目模板从VS2012中删除的更大原因之一。你应该考虑使用C语言代替它,它使用一个多通道编译器。通过打破这种依赖关系,您将在C++/CLI中取得领先。您可以通过在Form2类中声明一个事件来实现。Form1可以订阅它。一个事件?将方法体放入.cpp文件不是处理此问题的标准方法吗?