C#中我有一个用户控件,控件中有一个文本框A和一个按钮B。我在用户控件中点击B,程序会进入Thread线程C,C执行完成后将结果输入A。现在我在窗体中循环生成了多个用户控件,需要分别点击各个用户控件的B后将结果返回至对应的A中。
时间: 2024-04-07 14:33:33 浏览: 49
您可以使用委托和事件来实现这个需求。首先,在您的用户件中定义一个事件,用于通知窗按钮被点击的事件。然后,在窗体订阅这个事件,并在事件处理程序中执行线程操作。
下面是一个示例代码,示了如何实现这个功能:
在用户控件中:
```C#
public partial class MyControl : UserControl
{
// 定义委托事件
public delegate void ButtonClickEventHandler(object sender, EventArgs e);
public event ButtonClickEventHandler ButtonClick;
public MyUserControl()
{
InitializeComponent();
}
private void buttonB_Click(object sender, EventArgs e)
{
// 触发按钮点击事件
OnButtonClick(EventArgs.Empty);
}
protected virtual void OnButtonClick(EventArgs e)
{
ButtonClick?.Invoke(this, e);
}
public void SetResult(string result)
{
textBoxA.Text = result;
}
}
```
在窗体中:
```C#
public partial MyForm : Form
{
public MyForm()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// 循环生成多个用户控件
for (int i = 0; i < 5; i++)
{
MyUserControl userControl = new MyUserControl();
userControl.ButtonClick += UserControl_ButtonClick;
flowLayoutPanel1.Controls.Add(userControl);
}
}
private void UserControl_ButtonClick(object sender, EventArgs e)
{
MyUserControl userControl = (MyUserControl)sender;
// 创建线程并执行耗时操作
Thread thread = new Thread(() =>
{
string result = DoTimeConsumingTask();
// 将结果返回到对应的用户控件
userControl.Invoke(new Action(() =>
{
userControl.SetResult(result);
}));
});
thread.Start();
}
private string DoTimeConsumingTask()
{
// 执行耗时操作,并返回结果
Thread.Sleep(3000);
return "耗时操作的结果";
}
}
```
在这个示例中,窗体中的`flowLayoutPanel1`用于容纳多个用户控件。在窗体的加载事件中,我们循环创建多个用户控件,并订阅每个用户控件的按钮点击事件。当按钮被点击时,会触发事件处理程序,其中会创建一个新线程执行耗时操作,并将结果返回到对应的用户控件中。
请根据您的实际情况进行调整和修改。希望这可以帮助到您!
阅读全文