2017-04-09 116 views
0

之間的字符串我在C#以下的Windows窗體程序:傳遞形式

表1對一個ListBox和按鈕。當按下按鈕時,它將顯示Form2上有一個TextBox和Button。當按下Form 2上的按鈕時,它將把文本放到Form1上的列表框中。下面是每個表格的代碼,然後是我正在使用的類。任何建議都會很棒。

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

我想用一個自定義的處理程序。有任何建議嗎?

+0

_When表格2按下按鈕,就會把文成在Form1上ListBox中我已經更新了答案,對不起錯了一個 –

+0

之前。我想使用一個自定義的處理程序。當form2上的按鈕被按下時,form2應該關閉嗎?或者這種情況可能發生多次,每次按下按鈕時?也許你的意思是自定義** Event **而不是「處理程序」? –

+0

當我單擊form2上的按鈕使其添加到表單1上的列表框時,不會添加任何內容。 – JPJedi

回答

0

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

下面是窗體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); 
    } 
0

這是使用事件在窗體之間傳輸數據的好方法。

您的代碼看起來不錯。它有一個問題,但由於它運行良好,但Form2的事件不會觸發。

在按鈕Form2的clickevent中,您需要設置屬性NewText的值而不是字段newText。所以如果你改變btnSendToForm1_Click以下所有應該工作良好。

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