单击动态创建的按钮时,c#更改动态创建的文本框文本

时间:2019-01-02 22:46:22

标签: c#

当我单击动态创建的按钮时,我正在尝试更改动态创建的文本框的文本。

每次单击按钮时都会创建按钮和文本框,每个控件的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);
        }

3 个答案:

答案 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;
}