C#中我有一个用户控件,控件中有一个文本框A和一个按钮B。我在用户控件中点击B,程序会进入分线程C,C执行完成后将结果输入A。现在我在窗体中循环生成了多个用户控件,需要分别点击各个用户控件的B后将结果返回至对应的A中。
时间: 2024-04-07 18:33:29 浏览: 108
您可以使用事件和委托来解决这个问题。首先,在用户控件中定义一个事件,用于在点击按钮时触发。然后,在窗体中循环生成用户控件时,为每个用户控件的按钮点击事件绑定一个处理方法,这个处理方法会在点击按钮后执行分线程并将结果返回至对应的文本框。
以下是一个示例代码:
在用户控件中:
```csharp
public partial class MyUserControl : UserControl
{
// 定义事件
public event EventHandler<EventArgs> ButtonClicked;
public MyUserControl()
{
InitializeComponent();
}
private void button_Click(object sender, EventArgs e)
{
// 触发事件
ButtonClicked?.Invoke(this, EventArgs.Empty);
}
// 提供一个方法,用于设置文本框的值
public void SetTextBoxValue(string value)
{
textBoxA.Text = value;
}
}
```
在窗体中:
```csharp
public partial class MyForm : Form
{
public MyForm()
{
InitializeComponent();
}
private void CreateControls()
{
// 循环生成用户控件
for (int i = 0; i < 5; i++)
{
MyUserControl userControl = new MyUserControl();
userControl.ButtonClicked += UserControl_ButtonClicked;
// 将用户控件添加到窗体中
// ...
}
}
private void UserControl_ButtonClicked(object sender, EventArgs e)
{
// 在分线程中执行耗时操作
string result = DoWork();
// 获取触发事件的用户控件
MyUserControl userControl = sender as MyUserControl;
// 使用 Invoke 方法将结果返回至对应的文本框
userControl.Invoke((MethodInvoker)delegate
{
userControl.SetTextBoxValue(result);
});
}
private string DoWork()
{
// 执行耗时操作
// ...
return "结果";
}
}
```
通过以上代码,您可以在窗体中循环生成多个用户控件,并且每个用户控件的按钮点击事件都会在分线程中执行耗时操作,并将结果返回至对应的文本框。
阅读全文