我已经尝试了一段时间,将父Form1
的指针传递给子用户控件oP2_settings
。
此时,我正在尝试为基本设置功能实现用户控件。其中一些需要与父元素(状态条,窗口标题等)进行交互。
我设法通过两者实现了这个:
Form1
setParent
,其参数为Form1^
然而,我找不到任何不破坏设计师的解决方案。
例如,当我删除对类Form1
的前向引用时,设计器可以正常工作,但编译器自然不会允许编译以未定义的标识符为基础进行。
当我让程序运行时,设计师行为怪异。根据具体情况,有大约4种不同的错误'无法在传递给事件绑定服务的对象上设置事件'通过'找不到方法'或偶尔设计者加载,但不是在相应的选项卡中显示用户控件,而是在两者中都显示Form1
(用户控件作为单个元素)。
有什么方法可以让它在运行时/编译时和设计时都能运行?每次我想编译/移动元素时,我都不想在评论和注释掉我的行。
这是在C ++ Windows Forms应用程序中,我使用的是VS2010。
答案 0 :(得分:1)
这是一种设计过于紧密耦合的设计。没有父级,您的用户控件就无法生存。您应该使用事件而不是在父级和子级之间传递引用。
如果您的用户控件中的某些内容发生更改且父级需要更新,则在该用户控件中为此创建一个事件并将其触发。父进程又为事件安装处理程序并执行适当的操作。
答案 1 :(得分:0)
您应直接从父表单修改引用。您可以通过触发在用户控件中单击按钮执行此操作的父方法来执行此操作。
这是一个使用委托/事件的可用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);
}
};