当我单击动态创建的按钮时,我正在尝试更改动态创建的文本框的文本。
每次单击按钮时都会创建按钮和文本框,每个控件的Name
属性来自用户在其中插入名称的文本框。
例如,用户输入“ Test1”,然后按钮获取btn_Test1
,文本获取txt_Test1
。
该按钮应打开一个folderBrowserDialog
,并在选择了文本框后获得所选路径。
我正在使用以下代码:
protected void button_Click(object sender, EventArgs e)
{
Button button = sender as Button;
folderBrowserDialog.ShowDialog();
string TextName = button.Name.Replace("btn_", "txt_");
TextBox selectText = new TextBox();
selectText = this.Controls[TextName] as TextBox;
selectText.Text = folderBrowserDialog.SelectedPath;
}
不过,这部分给了我空值:selectText = this.Controls[TextName] as TextBox;
我在创建控件时确实与调试器进行过核对,因此TextName
设置了正确的名称。
按钮和文本框插入了tabControls,Tab Name获取用户输入的值,因此主tabControl获得2个控件。
我正在使用一个名为“ TabFolders”的隐藏TabControl,它将作为创建选项卡克隆的主要参考
我正在使用以下代码:
private void CreateDynamicPathButtons(string TabName)
{
TabPage MyNewTab = new TabPage(TabName);
TabPage TabCopy1;
tabControlEmpresas.TabPages.Add(MyNewTab);
TabControl tc = new TabControl();
tc.Location = new System.Drawing.Point(6, 6);
tc.Size = TabFolders.Size;
for (int i = 0; i < TabFolders.TabCount; i++)
{
TabFolders.SelectTab(i);
TabCopy1 = new TabPage(TabFolders.SelectedTab.Text);
foreach (Control c in TabFolders.SelectedTab.Controls)
{
Control cNew = (Control)Activator.CreateInstance(c.GetType());
cNew.Text = c.Text;
cNew.Size = c.Size;
cNew.Location = new System.Drawing.Point(c.Location.X, c.Location.Y);
cNew.Visible = true;
if (cNew is TextBox)
{
cNew.Name = "txt_" + MyNewTab.Text + "_" + TabFolders.SelectedTab.Text;
}
if (cNew is Button)
{
cNew.Name = "btn_" + MyNewTab.Text + "_" + TabFolders.SelectedTab.Text;
cNew.Click += new EventHandler(button_Click);
}
TabCopy1.Controls.Add(cNew);
}
tc.TabPages.Add(TabCopy1);
}
MyNewTab.Controls.Add(tc);
}
答案 0 :(得分:1)
假设button
是您在运行时创建的Button控件,那么您正在创建TextBox控件,但没有将其添加到Form.Controls
集合中({{ 1}})。
此外,您应该使用适合您当前布局的逻辑来分配位置,以放置新创建的控件。否则,所有新控件都将一个放在另一个控件的顶部。在该示例中,使用字段( this.Controls.Add([Control])
)确定新的Control位置,该字段跟踪运行时创建的Control的数量并添加一些基本的布局逻辑。
但是,如果您想保留这些新控件的引用,则应将它们添加到int ControlsAdded
或其他一些允许(如果需要)中选择它们的集合中。
List<Control>
答案 1 :(得分:1)
经过多次尝试,我确实找到了一个非常简单的解决方案。
TextBox selectText = new TextBox();
selectText = button.Parent.Controls[TextName] as TextBox;
父按钮具有所有控件。
答案 2 :(得分:0)
使用selectText = this.Controls[TextName] as TextBox;
,您正在尝试查找具有替换名称的按钮,该名称在这种情况下不可用,因此它返回null。这是逻辑错误。
string TextName = button.Name.Replace("btn_", "txt_");
也不替换按钮名称,它只是将替换的字符串分配给TextName。
正确的实现方式是
protected void button_Click(object sender, EventArgs e)
{
Button button = sender as Button;
folderBrowserDialog.ShowDialog();
button.Name = button.Name.Replace("btn_", "txt_");
TextBox selectText = new TextBox();
selectText = this.Controls[button.Name] as TextBox;
selectText.Text = folderBrowserDialog.SelectedPath;
}