在推进我的应用程序(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
}
感谢任何建议。
由于
答案 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());
}
也许不是最好的答案,但我会如何解决它。