1

我在我的 winform 上有一个 usercontrol,并且在每次单击按钮时(在运行时)创建多个用户控件。我usercontrol有一个textbox. 另外,在 winform 上我有一个简单的文本框。我希望,当我选择用户控件时,动态文本框中的文本也出现在简单文本框中。在我的代码中,它说来自用户控件的文本框不在当前上下文中。我的代码:

private void Gettext()
{
    int i = 0;
    Control[] txt = Controls.Find("txtBox" + i.ToString(), true);//here I search for the dynamical textbox
    foreach (Control c in panel1.Controls)
    {
        if (c is UserControl1) 
        {
            if (((UserControl)c).Selected)
                 txtSimple.Text= txtBox[0].Text ;
        }
        i++;
    }
4

4 回答 4

1
Control[] txt = ...
txtSimple.Text= txtBox[0].Text ;

可以将 txtBox[0].Text 替换为 txt[0].Text 吗?

于 2013-04-05T12:50:31.243 回答
1

好的开始

Control[] txt = Panel1.Controls.Find("txtBox" + i.ToString(), true)

然后

foreach (Control c in txt) // txt???
{
    UserControl1 uc = c as UserControl1;
    if (uc != null) 
    {
        if (uc.Selected) txtSimple.Text= uc.Text ;
    }
}

然后,如果您正在测试 UserControl1,您还应该转换为 UserControl1 而不是 UserControl

UserControl1 是一个非常糟糕的名字。

我什至不会提及假设所有控件的名称都以 txtBox 开头,并且没有其他控件具有...

如果在运行时选择了多个控件,则整个事物都会死掉。

于 2013-04-05T12:53:58.617 回答
1

我不知道我是否正确理解了你的问题:

您的表单结构如下所示:

  • 您的表单有一个 Panel panel1,其中包含许多 UserControl1 类型的 UserControl,在运行时创建,还有一个 TextBox txtSimple。
  • 每个 UserControl 都有一个名为 ["txtBox" + i] 的文本框
  • 在选择时要同步选定 UserControl 的 txtSimple 和 TextBox 的文本

然后:

int i=0;
foreach (Control c in panel1.Controls)
{
    if (c is UserControl1) 
    {
        if (((UserControl)c).Selected)
        {
             TextBox dynTxtBox = (TextBox)c.Controls["txtBox" + i];
             txtSimple.Text= dynTxtBoxe.Text;
        }
    }
    i++;
}

如果您无法通过这种方式找到您的 TextBox,则可能意味着它的名称设置不正确。

此外,如果您的 UserControl 上只有一个 TextBox,那么通常不需要以这种特定方式命名它(我的意思是从您的代码中我假设您的第一个用户控件上有 txtBox0,第二个用户控件上有 txtBox1,依此类推)。您可以简单地将其命名为“txtBox”,然后像这样访问它:

txtSimple.Text = selectedUserControl.Controls["txtBox"].Text;

控件名称在 Control、UserControl 和 Form 的 Controls 集合中是唯一的。

于 2013-04-05T13:16:29.610 回答
1

您需要在UserControl.

    //in UserControl
    public event EventHandler Selected;

    private void textBox1_MouseClick(object sender, MouseEventArgs e)
    {
        if(Selected!=null)
            Selected(this,null);
    }

现在在动态创建 UserControl 时订阅 Selected 事件。像这样:

    UserControl control = new UserControl();
    control.Selected += myControl_Selected;


    private void myControl_Selected(object sender, EventArgs e)
    {
        UserControl control = (UserControl)sender;
        textBox2.Text = control.Text;
    }

我希望这有帮助。

于 2013-04-05T13:24:00.037 回答