【问题标题】:How to access the controls on a UserControl?如何访问 UserControl 上的控件?
【发布时间】:2012-06-06 17:44:28
【问题描述】:

我创建了两个用户控件(名为 UserControl1 和 UserControl2)并动态地将一个添加到面板中:

UserControl yoozerControl;
if (pi != pie) {
    yoozerControl = new UserControl1();
} else {
    yoozerControl = new UserControl2();
}
panel1.Controls.Add(yoozerControl);
yoozerControl.Dock = DockStyle.Fill;

但是,我无法访问 UserControls 的成员。例如,UserControl1 有一个 TextBox1,但这不会编译:

UserControl yoozerControl;
if (pi != pie) {
    yoozerControl = new UserControl1();
    String s = yoozerControl.TextBox1.Text;
. . .

我必须做什么才能访问 UserControls 上控件的属性?

更新

// I was able to successfully test this by changing UserControl1's TextBox1 Modifier
// property to public, and the same with UserControl2's label1 Modifier property.
UserControl1 yoozerControl = null;
UserControl2 yowzerControl = null;
String s = String.Empty;
if (AppType.Equals(SearchTypes.Platypus)) {
    yoozerControl = new UserControl1();
    s = yoozerControl.textBox1.Text;
} else {
    yowzerControl = new UserControl2();
    s = yowzerControl.label1.Text;
}
    if (!(null == yoozerControl)) {
    panel1.Controls.Add(yoozerControl);
    yoozerControl.Dock = DockStyle.Fill;
    MessageBox.Show(s);
}
if (!(null == yowzerControl)) {
    panel1.Controls.Add(yowzerControl);
    yowzerControl.Dock = DockStyle.Fill;
    MessageBox.Show(s);
}

【问题讨论】:

    标签: c# winforms dynamic user-controls


    【解决方案1】:

    您需要将用户控件键入为您的控件。 UserControl1 或 UserControl2(不是 UserControl)

    正如亚当所提到的,如果您还没有公开访问,那么您也需要处理它。

    【讨论】:

      【解决方案2】:

      在您正确键入 yoozerControl 后,正如 @Kenneth 所说(对他 +1),您需要将这些文本框公开为您的用户控件的公共属性:

      public TextBox yourTB{
          get { return TextBox1; }
      }
      

      或者,为了更简洁,只需公开一个返回文本框文本的属性,这正是您所需要的。

      public string yourTBsText {
          get { return TextBox1.Text; }
      }
      

      【讨论】:

      • 公开控件的正确方法是将“修饰符”属性设置为您想要的任何可见性。
      • @w.brian - 假设你真的想要暴露整个文本框,当然。根据他的情况,通过纯 C# 属性公开 TB 的文本可能是理想的解决方案。
      • 我只是想为这个问题提供最理想的解决方案。当设计人员支持公开控件时手动执行此操作并不理想,至少在他声明的要求下是这样。
      • 除非有某种令人信服的理由直接公开文本框,否则通常最好创建自己的属性。将文本框设为公共与拥有公共字段相同。打破封装/增加耦合。
      • Increases coupling - 正是 - 这是我主要关心的问题。 @肯
      【解决方案3】:

      在您的用户控件上,选择要公开的控件并查看属性窗口。将“修改器”属性更改为“公共”以使其具有最大的可见性。

      【讨论】:

      • +1 - 如果用户真的只想暴露整个 TB,那么这是正确的答案(一旦你按照 Kenneth 所说的去做)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多