我在winform上有一个usercontrol
,我在每次点击按钮时都会创建多个用户控件(在运行时)。我usercontrol
有一个textbox
。另外,在winform上我有一个简单的文本框。我想,当我选择一个用户控件时,动态文本框中的文本也出现在简单的文本框中。在我的代码中,它表示来自usercontrol的文本框不在当前上下文中。我的代码:
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++;
}
答案 0 :(得分:1)
Control[] txt = ...
txtSimple.Text= txtBox[0].Text ;
可以将txtBox [0] .Text替换为txt [0] .Text?
答案 1 :(得分: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开头的名称并且没有其他控件具有的假设......
如果在运行时选择了多个控件,整个过程就会死亡。
答案 2 :(得分:1)
我不知道我是否理解你的问题:
表单的结构如下所示:
然后:
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集合中是唯一的。
答案 3 :(得分: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;
}
我希望这会有所帮助。