【问题标题】:Passing a string between forms在表单之间传递字符串
【发布时间】:2017-04-09 14:55:47
【问题描述】:

我在 C# 中有以下 Windows 窗体程序:

Form 1 上有一个 ListBox 和 Button。当按下 Button 时,它将显示 Form2 上面有一个 TextBox 和 Button。当按下 Form 2 上的 Button 时,它会将文本放入 Form1 上的 ListBox 中。下面是每个表单的代码,然后是我正在使用的类。任何建议都会很棒。

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; }
    }
}

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

【问题讨论】:

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

标签: c# winforms event-handling


【解决方案1】:

这是 Form2 中自定义 Event 的示例:

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);
    }

【讨论】:

    【解决方案2】:

    Form1 代码,只是普通的表格,有显示和隐藏

            private void button1_Click(object sender, EventArgs e)
            {
                Form2 f = new Form2();
                f.ShowDialog();
                listBox1.Items.Add(f.test);
            }
    

    Form2 代码 制作一个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();
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

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

      您的代码看起来不错。它有一个问题,虽然它可以正常运行,但 Form2 的事件不会触发。

      Form2的按钮的点击事件中,你需要设置属性NewText的值而不是字段newText。因此,如果您将btnSendToForm1_Click 更改为以下所有内容都应该可以正常工作。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-17
        • 1970-01-01
        • 2015-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多