如何以编程方式将控件添加到表单中,公开?

时间:2016-06-01 02:47:46

标签: c# winforms

例如

    Form1 frm1 = new Form1();
    TextBox tb = new TextBox();
    frm1.Controls.Add(tb);

现在我无法说frm1.tb,因为tb不公开。

如果我绘制了文本框,那么我可以转到属性窗口并将修改器设置为public。所以,我知道如何在GUI中完成它。

但我怎么能以编程方式进行呢?

添加了澄清

有些人提出了frm.tb的替代方案,这不是我想要的。

我会详细说明。

考虑这个winforms计划。它有两种形式。 Form1和FormX

这是FormX

enter image description here

Form1在其加载

中只有这个代码
    FormX frmx = new FormX();
    frmx.drawnTextBox.Text = "blah"; //works
    TextBox programmaticallyMadeTextbox = new TextBox();

    frmx.Controls.Add(programmaticallyMadeTextbox);
    frmx.Show();
    frmx.programmaticallyMadeTextbox.Text = "asdf"; // does not compile
    // can't say frm1.programmaticallyMadeTextbox.Text="asdf"
    // why not?
    // I suppose because programmaticallyMadeTextbox is not public
    // how can I make it public like my drawnTextBox is public?

它意味着向FormX添加一个文本框,并设置文本框的文本属性,就像我使用drawnTextBox一样。

我能用drawTextBox做到这一点的原因是我将modifier属性设置为public。我想以某种方式用我编程的文本框来做到这一点。

2 个答案:

答案 0 :(得分:4)

通常我会在动态添加控件时执行此操作,为其提供(正确的)名称,并在需要时从集合中查找控件。

TextBox textbox = new TextBox();
// other properties
textbox.Name = "newtextbox";  // Any unique name
form1.Controls.Add(textbox); 

现在您可以访问这些元素了。

var textbox = Controls.OfType(TextBox)().FirstOrDefault(x=>x.Name == "newtextbox");

if(textbox != null)
{
    // access element.
}

答案 1 :(得分:-1)

您可以将此行添加到Form1文件中的Form1.cs类。

public TextBox tb;

并将您的示例更改为

Form1 frm1 = new Form1();
frm1.tb = new TextBox();
frm1.Controls.Add(frm1.tb);

或者您可以使用TextBoxfrm1.Controls.OfType<TextBox>().Single()frm1.Controls.OfType<TextBox>().First()访问frm1.Controls.OfType<TextBox>().Last()