【发布时间】:2021-03-17 10:06:36
【问题描述】:
所以我有MainPage 表单,这个表单包含三个用户控件newIngredient、recipeAcrhive、recipesCenter,我试图从recipeAcrhive 访问recipesCenter 的可见属性,因为我想访问recipesCenter 中的文本框然后显示 recipesCenter 但这没用,我尝试了很多解决方案,例如
这里的困惑是recipeAcrhive 消失了,recipesCenter 仍然不可见
第一个解决方案
从MainPage 创建新实例,然后使用 Controls 属性访问recipesCenter 并访问文本框,然后隐藏recipeAcrhive,最后显示recipesCenter
frmMainPage frm = new frmMainPage();
frm.Controls["recipesCenter"].Controls["txtName"].Text = "Meet";
this.Visible = false;
frm.Controls["recipesCenter"].Visible = true;
第二种解决方案
从MainPage 和RecipesCenter 创建新实例,然后使用Controls 属性访问文本框并隐藏recipeAcrhive 最后将RecipesCenter 的实例添加到MainPage 表单控件中
frmMainPage frm = new frmMainPage();
RecipesCenter rc = new RecipesCenter();
rc.Controls["recipesCenter"].Controls["txtName"].Text = "Meet";
frm.Controls.Add(rc);
第三种解决方案
在MainPage 中创建方法,并在此方法中创建具有隐藏可见性的recipeArchive 和具有显示可见性的recipesCenter,并使用MainPage 实例从recipeArchive 访问此方法
// inside MainPage
public void showRecipesCenter() {
recipeArchive.Visible = false;
recipesCenter.Visible = true;
}
// inside recipeArchive
frmMainPage frm = new frmMainPage();
frm.showRecipesCenter();
任何人都可以帮助我,让我开心
【问题讨论】:
-
您需要使用表单的实例,并且当您返回时表单无法关闭,因此您必须捕获关闭事件。查看我的两个表单项目:stackoverflow.com/questions/34975508/…
-
我看不出你为什么需要第二种形式;您需要做的就是将 Usercontrol 中 TextBox 的 修饰符(在属性面板中)从
private更改为internal。 -
@TaW 我尝试更改修饰符,但这没用
-
但这没用 这不是一个有用的问题描述!不在这里也不在帖子里!!必须有一个非私有的访问修饰符来访问一个控件。但你也写关于可见性的文章,这是完全不同的事情。所以你需要更好地解释你想要什么,发生了什么,出了什么问题,你遇到了哪些错误信息,否则我们无法帮助你! - 请注意,创建表单的新实例是非常常见的初学者错误。不要那样做!!
-
如果您需要一个 UserControl 与另一个进行通信,我会使用 Form 作为中间人。使第一个 UserControl 引发 Form 订阅的 CUSTOM EVENT。当 Form 收到事件时,它可以将消息传递给第二个 UserControl。这样两个 UserControl 就不需要直接相互了解。 Form 知道他们两个,为什么不使用这个事实呢?
标签: c# winforms user-controls