C# 在窗体之间传递字符串

C# 在窗体之间传递字符串,c#,winforms,event-handling,C#,Winforms,Event Handling,我有以下C#格式的windows窗体程序: 表格1上有一个列表框和按钮。按下按钮时,将显示带有文本框的Form2和按钮。当按下表单2上的按钮时,它会将文本放入表单1上的列表框中。下面是每个表单的代码,然后是我正在使用的类。任何建议都很好 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(ob

我有以下C#格式的windows窗体程序:

表格1上有一个列表框和按钮。按下按钮时,将显示带有文本框的Form2和按钮。当按下表单2上的按钮时,它会将文本放入表单1上的列表框中。下面是每个表单的代码,然后是我正在使用的类。任何建议都很好

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        Form2 frm2 = new Form2();

        frm2.NewTextChanged += new EventHandler<CustomEvent>(form2_NewTextChanged);
        frm2.ShowDialog();            
        // Unsubscribe from event
        frm2.NewTextChanged -= form2_NewTextChanged;           
        frm2.Dispose();
        frm2 = null;
    }
    private void form2_NewTextChanged(object sender, CustomEvent e)
    {
        //Text = e.Text;
        lbItem.Items.Add(e.Text);
    }
}

public partial class Form2 : Form
{        
    public event EventHandler<CustomEvent> NewTextChanged;
    private string newText;
    public Form2()
    {
        InitializeComponent();
    }
    public string NewText
    {
        get { return newText; }
        set
        {
            if (newText != value)
            {
                newText = value;
                OnNewTextChanged(new CustomEvent(newText));
            }
        }
    }
    protected virtual void OnNewTextChanged(CustomEvent e)
    {            
        EventHandler<CustomEvent> eh = NewTextChanged;
        if (eh != null)
            eh(this, e);
    }
    private void btnSendToForm1_Click(object sender, EventArgs e)
    {
        newText = textBox1.Text;
    }
}

public class CustomEvent : EventArgs
{     
    private string text;
    public CustomEvent(string text)
    {
        this.text = text;
    }
    public string Text
    {
        get { return text; }
    }
}
公共部分类表单1:表单
{
公共表格1()
{
初始化组件();
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
Form2 frm2=新的Form2();
frm2.NewTextChanged+=新事件处理程序(form2_NewTextChanged);
frm2.ShowDialog();
//取消订阅活动
frm2.NewTextChanged-=格式2_NewTextChanged;
frm2.Dispose();
frm2=零;
}
私有void form2\u NewTextChanged(对象发送方,CustomEvent e)
{
//Text=e.Text;
lbItem.Items.Add(e.Text);
}
}
公共部分类表单2:表单
{        
公共事件事件处理程序已更改;
私有字符串newText;
公共表格2()
{
初始化组件();
}
公共字符串新文本
{
获取{return newText;}
设置
{
if(newText!=值)
{
newText=值;
OnNewTextChanged(新自定义事件(newText));
}
}
}
受保护的虚拟void OnNewTextChanged(CustomEvent e)
{            
EventHandler eh=NewTextChanged;
如果(eh!=null)
呃(这个,e),;
}
私有void btnSendToForm1_单击(对象发送者,事件参数e)
{
newText=textBox1.Text;
}
}
公共类CustomEvent:EventArgs
{     
私有字符串文本;
公共自定义事件(字符串文本)
{
this.text=文本;
}
公共字符串文本
{
获取{返回文本;}
}
}

我想使用自定义处理程序。有什么建议吗?

格式1代码,只是带有显示和隐藏的普通格式

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 f = new Form2();
            f.ShowDialog();
            listBox1.Items.Add(f.test);
        }
表格2代码 创建Form1可以读取的公共变量

namespace WindowsFormsApplication1
{
    public partial class Form2 : Form
    {
        public string test;
        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            test = textBox1.Text;
            this.Hide();
        }
    }
}

以下是表单2中自定义事件的示例:

public partial class Form2 : Form
{

    public delegate void NewText(string item);
    public event NewText NewTextChanged;

    public Form2()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (NewTextChanged != null)
        {
            NewTextChanged(textBox1.Text);
        }
    }

}
…以下是Form1订阅该活动的方式:

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 frm2 = new Form2();
        frm2.NewTextChanged += Frm2_NewTextChanged;
        frm2.Show();
    }

    private void Frm2_NewTextChanged(string item)
    {
        lbItem.Items.Add(item);
    }

这是使用事件在表单之间传输数据的好方法

你的代码看起来不错。它有一个问题,虽然由于它将运行良好,但Form2的事件不会触发

Form2
按钮的点击事件中,您需要设置属性
NewText
的值,而不是字段
NewText
。因此,如果您将
btnSendToForm1\u更改为单击
,如下所示,所有操作都会正常工作

private void btnSendToForm1_Click(object sender, EventArgs e)
{
    this.NewText = textBox1.Text;
}

我已经更新了答案,很抱歉之前的错误。当按下表单2上的按钮时,它会将文本放入表单1上的列表框中。我想使用自定义处理程序。当按下form2上的按钮时,form2是否应关闭?…或者每次按下按钮时,是否可能发生多次?也许你指的是自定义事件而不是“处理程序”?当我单击form2上的按钮将其添加到Form1上的列表框时,没有添加任何内容。我只是在下面发布了此问题的解决方案。你可以参考一下。这是代码中的一个很小的错误。我的回答已经改正了。