C++ 将父窗体的引用传递给c+中的子UserControl+;
我一直在尝试将父C++ 将父窗体的引用传递给c+中的子UserControl+;,c++,wpf,winforms,visual-studio-2010,C++,Wpf,Winforms,Visual Studio 2010,我一直在尝试将父Form1指针传递给子用户控件oP2\u设置 此时,我正在尝试实现基本设置功能的用户控件。其中一些需要与父元素(状态条、窗口标题等)交互 我通过以下两种方式实现了这一点: 从Form1 执行一个单独的void函数setParent,该函数的参数为Form1^ 然而,我找不到任何解决方案,不打破设计师。 例如,当我删除对类Form1的前向引用时,设计器可以工作,但编译器自然不允许基于未定义的标识符进行编译 当我让程序运行时,设计师表现得很怪异。根据具体情况,大约有4种不同的错误
Form1
指针传递给子用户控件oP2\u设置
此时,我正在尝试实现基本设置功能的用户控件。其中一些需要与父元素(状态条、窗口标题等)交互
我通过以下两种方式实现了这一点:
- 从
Form1
- 执行一个单独的void函数
,该函数的参数为setParent
Form1^
Form1
的前向引用时,设计器可以工作,但编译器自然不允许基于未定义的标识符进行编译
当我让程序运行时,设计师表现得很怪异。根据具体情况,大约有4种不同的错误,分别是“无法通过“找不到方法”在传递给事件绑定服务的对象上设置事件”或偶尔设计器加载,但不是在相应选项卡中显示用户控件,而是在这两种情况下显示Form1
(用户控件作为单个元素)
有什么方法可以让它同时在运行时/编译时和设计时工作吗?我不喜欢每次我想编译/移动一个元素时,都要对我的行进行注释
这是C++窗体应用程序,我使用VS201.
这是一个设计得过于紧密的耦合。没有父控件,用户控件无法生存。您应该使用事件,而不是在父级和子级之间传递引用
如果用户控件中发生了更改,并且父控件需要更新,则在用户控件中为此创建一个事件并激发它。父窗体会依次安装事件的处理程序并执行相应的操作。您应该直接从父窗体修改引用。您可以通过在用户控件中单击按钮时触发执行此操作的父方法来执行此操作
这里是一个使用委托/事件的工作Visual C++代码:
//UserControl.h
namespace YourNamespace {
delegate void ClickEventHandler(String ^); //instead of "String^" place your / other parameters
public ref class YourUserControl: public System::Windows::Forms::UserControl
{
public:
event ClickEventHandler^ OnClick; // declare the event OnClick
ExaminationTabControl()
{
InitializeComponent();
//
//TODO: Add the constructor code here
//
}
...
#pragma endregion
private: System::Void btn1_onClick(System::Object^ sender, System::EventArgs^ e) {
his->txtFirstName->Text + " " + this->txtLastName->Text;
OnClick("The string to be sent.");
}
}
};
以家长的形式:
//Parent.h
namespace YourNamespace {
...
#pragma endregion
public: void methodToBeTriggered(String^ yourString) {
this->txtBox->Text = yourString; // now you have access to all the references
}
private: void methodWhereYouCreateUserControlInstance() {
YourUserControl^ userControl= gcnew YourUserControl();
userControl->OnClick += gcnew ClickEventHandler(this, &ParentClassName::methodToBeTriggered);
}
};
在我看来,您的用户控件与父窗口绑定得太紧了。您可能需要考虑让用户控件公开父窗体注册的事件。因此,如果(statusChangedFunc!=NULL)statusChangedFunc(someString),您将使用
,而不是m\u parent->SetWindowTitle(someString)
。谢谢您的回答。关于如何做这件事,我很难找到好的参考资料。在我看来,从设计器生成的代码中可以看到,这里注册了一个事件处理程序:this->but\u connectNow->Click+=gcnew System::EventHandler(this,&oP2\u settings::but\u connectNow\u Click),我尝试过在其他类中更改对方法的引用,但这并不奇怪。我现在该怎么办?我认为我不能简单地在Form1类中注册一个处理程序,因为事件是特定于实例的。我是否要创建一个从类中的handler方法触发的公共(静态?)事件?最后,我在MSDN(所有位置)上找到了一个足够好的引用。显然是的,答案在于从注册为事件处理程序的方法中触发一个公共事件,以便单击按钮。链接到MSDN页面:谢谢,我也会尝试一下