【问题标题】:How to access textbox inside UserControl from another one如何从另一个访问 UserControl 中的文本框
【发布时间】:2021-03-17 10:06:36
【问题描述】:

所以我有MainPage 表单,这个表单包含三个用户控件newIngredientrecipeAcrhiverecipesCenter,我试图从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;

第二种解决方案

MainPageRecipesCenter 创建新实例,然后使用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


【解决方案1】:

终于找到了解决办法,代码一定是这样的

public partial class frmMainPage : Form {
    public frmMainPage() {
        InitializeComponent();
    }

    private static frmMainPage frm;

    public static frmMainPage Instance {
         get {
             if (frm == null)
                 frm = new frmMainPage();
             return frm;
         }
    }

    private void frmMainPage_Load(object sender, EventArgs e) {
         frm = this;
    }
}

在您的UserControl 中,代码必须是这样的

public partial class yourUserControl : UserControl {      
    frmMainPage.Instance.anotherUserControl.txtName.Text = "Stack Overflow";
}

【讨论】:

  • 这可行,但更好(更惯用)的方式是让用户控件引发事件,主窗体处理该事件并更改其他控件。这样每个用户控件就不必知道其他控件的内部结构。
  • @BenVoigt 当然,你是对的。你说的这个定义叫做Loosely Coupled
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2017-06-15
  • 2011-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多