两个子窗口Form1和Form2,以及一个委托方法来操作Form2中的ListBox控件。代码实现
时间: 2024-02-20 19:00:48 浏览: 31
好的,以下是实现的代码示例:
在Form1中:
```csharp
public partial class Form1 : Form
{
private Form2 form2;
public delegate void UpdateListBoxDelegate(string text);
public Form1()
{
InitializeComponent();
form2 = new Form2();
// 订阅Form2中ListBox的更新事件
form2.ListBoxUpdated += UpdateListBox;
}
private void btnOpenForm2_Click(object sender, EventArgs e)
{
form2.Show();
}
private void UpdateListBox(string text)
{
if (lstBoxOutput.InvokeRequired)
{
// 如果不是在UI线程上调用,则使用委托
Invoke(new UpdateListBoxDelegate(UpdateListBox), new object[] { text });
}
else
{
// 在UI线程上更新ListBox
lstBoxOutput.Items.Add(text);
}
}
}
```
在Form2中:
```csharp
public partial class Form2 : Form
{
public event UpdateListBoxDelegate ListBoxUpdated;
private void btnUpdateListBox_Click(object sender, EventArgs e)
{
if (ListBoxUpdated != null)
{
// 触发ListBox更新事件
ListBoxUpdated.Invoke(txtBoxInput.Text);
}
}
}
```
在这个例子中,我们使用了委托来让Form2中的按钮更新Form1中的ListBox控件。具体来说,我们在Form1中定义了一个委托`UpdateListBoxDelegate`,以及一个方法`UpdateListBox`来更新ListBox控件。然后在Form1的构造函数中,订阅了Form2中ListBox的更新事件。在Form2中,我们定义了一个事件`ListBoxUpdated`,并在按钮的点击事件中触发了这个事件。当Form1订阅了Form2的事件后,就可以在事件处理函数中调用`UpdateListBox`方法来更新ListBox控件了。需要注意的是,如果不是在UI线程上调用`UpdateListBox`方法,则需要使用`Invoke`方法来在UI线程上执行委托。