2013-10-08 73 views
0

我有兩個WinForm的FORMAFormB,當我在備考點擊按鈕,FormB將陸續推出。傳遞價值的WinForm過程

FormB有一些按鈕,每個按鈕都分配了一些值,當我點擊任何按鈕時,分配給該窗體的值必須傳遞給formA,在那裏我需要處理但兩個窗體都必須處於活動狀態。

下面的代碼連接到形式上的按鈕,啓動formB

  FormA bar = new FormA ("Login"); 
      bar = this; 
      FormB pad = new FormB (ref bar); 
      pad.ShowDialog(); 
      MessageBox.Show(this.getValue.ToString()); 

的問題是,我不能夠讀取值FormB按鈕點擊,直到我關閉formB屏幕。我正在尋找某種方式將值委託給FormA進行處理。

我FormB樣子,

FormA s = null; 
    string txtInput = String.Empty; 

    public FormB (ref FormA form1handle) 
    { 
     InitializeComponent(); 
     s = form1handle; 
    } 

    public string getFormBValue { 
     get { return txtInput; } 
    } 

private void Dial1_Click(object sender, EventArgs e) 
    { 
     //txtInput = Dial1.Text; 
     s.getValue = Dial1.Text; 
     MessageBox.Show(s.getValue.ToString());   
    } 

PS:使用FormB我想實現一個電話撥號盤,這將被用來傳遞DTMF輸入。

回答

2

爲了您描述的場景我會利用EventHandler Delegate在你FormB觸發這是由你的FormA監控的event

FormB(我稱爲窗體2)

namespace WindowsFormsApplication 
{ 
    using System; 
    using System.Windows.Forms; 

    public partial class Form2 : Form 
    { 
     public EventHandler<MyEventArgs> MyEventHandler; 

     public Form2() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      var eventArgs = new MyEventArgs() 
      { 
       TriggeredDateTime = DateTime.UtcNow, 
       Value = 5 
      }; 

      OnMyEventHandler(eventArgs); 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      var eventArgs = new MyEventArgs() 
      { 
       TriggeredDateTime = DateTime.UtcNow, 
       Value = 10 
      }; 

      OnMyEventHandler(eventArgs); 
     } 

     private void OnMyEventHandler(MyEventArgs args) 
     { 
      var handler = MyEventHandler; 
      if (handler != null) 
      { 
       handler(this, args); 
      } 
     } 
    } 

    public class MyEventArgs : EventArgs 
    { 
     public DateTime TriggeredDateTime { get; set; } 
     public int Value { get; set; } 
    } 
} 

FormA(我指爲Form1)

namespace WindowsFormsApplication 
{ 
    using System.Windows.Forms; 

    public partial class Form1 : Form 
    { 
     private Form2 form2; 

     public Form1() 
     { 
      InitializeComponent(); 

      form2 = new Form2(); 
      form2.MyEventHandler += Form2EventHandler; 

     } 

     public void Form2EventHandler(object sender, MyEventArgs args) 
     { 
      MessageBox.Show(string.Format("Received value: {0}", args.Value)); 
     } 

     private void button1_Click(object sender, System.EventArgs e) 
     { 
      form2.ShowDialog(); 
     } 
    } 
} 

我省略了設計的代碼,因爲它是遠冗長,但是,你從以上FormB(窗體2)的例子中見有兩個按鈕控件和FormA(Form1中)具有一個單一的按鈕控件。

Form2暴露了EventHandlerForm1訂閱了,當Form2一個Button被按下的MyEventArgs一個實例被創建,存儲要發送到Form1值(連同日期時間值作爲精密)和OnMyEventHandler代表被提出。 Form1然後檢測到事件已發生並且Form2EventHandler處理該事件。

EventHandler委託方法將與其他控制工作太應該的願望。您可以更改MyEventArgs以獲得儘可能多的Properties,如果您願意,可以通過TextBox控件控制set,其中Button控件按下。

+0

我正在尋找這樣的一些東西。我會測試它並儘快更新。 – AKV

+0

當我聲明公共EventHandler MyEventHandler;我得到這個錯誤。 \t「類型'FormA.FormB.MyEventArgs'不能用作泛型類型或方法'System.EventHandler '中的類型參數'TEventArgs'」 – AKV

+0

這是由'MyEventArgs'類不是從'EventArgs'明確派生的。 .NET 4要求你顯式地從'EventArgs'派生,.NET 4.5(我構建了我的例子)沒有。我已經更新了我的示例,用於'Form2'以顯示'EventEnd'派生的'MyEventArgs'。 – 2013-10-08 08:58:47

0

向表單B添加一個隱藏文本框,並向窗體A添加一個方法SetChildFromValueToParent,窗體B中的隱藏文本框的值發生更改時將調用此方法。基本上,在表格B按鈕客戶端事件你有該按鈕值隱藏文本框設置在表B.

以下邏輯添加到您的A按鈕點擊這將打開B

private void button1_Click(object sender, EventArgs e) 
{ 
    B childForm = new B(); 

    //Find the textbox control in the child form 
    Control[] controls = childForm.Controls.Find("textBox", true); 

    if (null != controls[0]) 
    { 
     //Bind the method in the parent form to child form text control's TextChanged event 
     controls[0].TextChanged += new System.EventHandler(SetChildFromValueToParent); 
    } 

    childForm.ShowDialog(); 
} 

添加下面的方法你From A

private void SetChildFromValueToParent(object obj, EventArgs args) 
     { 
      //Read the child form's hidden control value and set it to parent form 
      B from2 = new B(); 
      string value = ((TextBox)form2.Controls["textBox1"]).Text;    
     } 
+0

我嘗試更新的代碼按烏爾建議。但是當我點擊FormA中的按鈕啓動FormB時,整個應用程序崩潰。 – AKV

+0

您是否使用名稱文本框將隱藏文本框添加到表單B.這一行需要Control [] controls = childForm.Controls.Find(「textBox」,true); – Kurubaran

+0

是的,我做過,ToolStripTextBox textbox = new ToolStripTextBox()。我嘗試使用TextBox以及沒有工作。 – AKV

0

您可以在FormB創建一些公共屬性和表單內進行設置。然後使用FormA中的這些屬性來獲取數據。這裏是例子(假設你有FormB 「關閉」 按鈕和文本框):

public partial class FormB : Form 
{ 
    public string PhoneNumber { get; private set; } 

    private void buttonClose_Click(object sender, EventArgs e) 
    { 
     this.PhoneNumber = textBoxPhone.Text; 
     this.DialogResult = DialogResult.OK; 
     this.Close(); 
    } 
} 
備考

然後:

FormB pad = new FormB(); 
var phoneFromFormB = String.Empty; 
if (pad.ShowDialog() == DialogResult.OK) 
{ 
    phoneFromFormB = pad.PhoneNumber;    
}  

更新

如果同時需要表單將被激活,只需在FormB中設置屬性而不關閉它。屬性設置後,可以從FormA訪問它們。同時爲了使它們都處於活動狀態,您將需要使用Show()方法而不是ShowDialog()

0

而不是FormB是一種形式,爲什麼不創建FormB作爲可以添加到FormA的UserControl - 在窗體設計器中編譯後,從Toolbox拖動。

然後,您可以通過ParentForm屬性或傳遞給它的引用(具體類或接口)直接從UserControl訪問FormA的屬性/方法。短tutorial。這意味着FormA和Dialpad都可以在ShowDialog是模態的同時處於活動狀態。

無需使用ref關鍵字既可以作爲表格是引用類型。注意:我將在FormA中實現一個接口,並將其作爲類型而不是FormA直接使用。

public FormB : UserControl 
{ 

    FormA s = null; 
    string txtInput = String.Empty; 

    public FormB (FormA form1handle) 
    { 
     InitializeComponent(); 
     s = form1handle; 
    } 

    public FormB() 
    { 

    } 

    public FormA Parent 
    { 
     get 
     { 
      if(s == null) 
       s = (FormA)ParentForm; 
      return s; 
     } 
    } 

    public string getFormBValue { 
     get { return txtInput; } 
    } 

private void Dial1_Click(object sender, EventArgs e) 
    { 
     //txtInput = Dial1.Text; 
     Parent.getValue = Dial1.Text; 
     MessageBox.Show(Parent.getValue.ToString());   
    } 
    }