C#如何将动态内容添加到动态按钮?

时间:2014-09-02 15:55:33

标签: c# winforms dynamic

在推进我的应用程序(winforms)时,我发现需要将动态生成的内容推送到按钮,然后在消息框中显示该动态内容。

我正在做的是根据产品选择从文件中读取FTP链接,然后我想获取每一行并让它附加一个文本框和一个按钮,以便他们可以填写文件名。

我有它工作,标签,文本框和按钮都出现在我期望的地方。现在我想要的是点击时按钮显示我刚刚生成的内容。

所以我现在的代码按预期生成所有内容如下。我只需要知道如何让按钮接受我的ftpLabel.Text和tb.Text数据。我试着点击这里的帖子:How can i create dynamic button click event on dynamic button? 但是,我似乎无法让它接受我的任何动态内容。

    private void productComboBox_SelectedItemChanged(object sender, EventArgs e)
    {
        // Read from the text file and out put the results
        try
        {
            using (StreamReader sr = new StreamReader(selectedProduct + ".txt"))
            {
                string line;
                int l = 0;

                // build the ftp link records line by line
                while ((line = sr.ReadLine()) != null)
                {
                    Label ftpLabel = new Label();
                    ftpLabel.AutoSize = true;
                    ftpLabel.Text = line;
                    TextBox tb = new TextBox();
                    Button bt = new Button();
                    bt.Text = "Copy Link";
                    bt.Click += bt.Click;
                    flp.Controls.Add(ftpLabel);
                    flp.Controls.Add(tb);
                    flp.Controls.Add(bt);

                    l++;
                }
                ftpGroupBox.Controls.Add(flp);
            }
        }
        // If the read fails then output the error message in the same section
        catch (Exception ex)
        {
            Label ftpErrorLabel = new Label();
            ftpErrorLabel.AutoSize = true;
            ftpErrorLabel.ForeColor = Color.Red;
            ftpErrorLabel.Text = "Error: " + ex.Message;
            flp.Controls.Add(ftpErrorLabel);
            ftpGroupBox.Controls.Add(flp);
        }
    }

    void bt_Click(object sender, EventArgs e)
    {
        MessageBox.Show("Does this work?");
        // this message displays but cannot pass my dynamicly created content to this
    }

感谢任何建议。

由于

1 个答案:

答案 0 :(得分:1)

按钮和相应的标签和文本框之间需要一个钩子。这可能不是正确的方法,但最简单的方法是将命名约定引入钩子。

try
    {
        using (StreamReader sr = new StreamReader(selectedProduct + ".txt"))
        {
            string line;
            int l = 0;

            // build the ftp link records line by line
            while ((line = sr.ReadLine()) != null)
            {
                Label lFTPtextext = new Label()
                 {
                    AutoSize = true,
                    Text = line,
                    Tag = l
                 };


                Button bt = new Button()
                 {
                   Text = "Copy Link",
                   Tag = l
                 }

                 bt.Click += bt.Click;

                TextBox tb = new TextBox()
                {
                   Tag = l
                }

                flp.Controls.Add(lFTPtextext);
                flp.Controls.Add(tb);
                flp.Controls.Add(bt);

                l++;
            }
            ftpGroupBox.Controls.Add(flp);
        }
    }
    // If the read fails then output the error message in the same section
    catch (Exception ex)
    {
        Label ftpErrorLabel = new Label();
        ftpErrorLabel.AutoSize = true;
        ftpErrorLabel.ForeColor = Color.Red;
        ftpErrorLabel.Text = "Error: " + ex.Message;
        flp.Controls.Add(ftpErrorLabel);
        ftpGroupBox.Controls.Add(flp);
    }
}

void bt_Click(object sender, EventArgs e)
    {
        string tagNumber = ((Button)sender).Tag.ToString();

        var tbText= this.Controls.OfType<TextBox>()
                           .Where(x => x.Tag.ToString() == tagNumber)
                           .FirstOrDefault()

        var lblText = this.Controls.OfType<Label>()
                           .Where(x => x.Tag.ToString() == tagNumber)
                           .FirstOrDefault()

        MessageBox.Show(tbText.ToString() + " " + lblText.ToString());
    }

也许不是最好的答案,但我会如何解决它。