2013-03-15 72 views
1

我有我的媒體播放器項目中的2表單我已經使from1(父窗體)的對象,並從form1 form3中獲得價值。但我也需要從form3到form1的變量值。但問題是,當我做form3的對象在Form1這樣從孩子獲得價值從父母形式

Form3 m_child; 

    public Form1(Form3 frm3) 
    { 
     InitializeComponent(); 
     m_child = frm3; 
    } 

它顯示在的Program.cs1跳轉不包含包含0參數構造錯誤。我知道我必須通過那裏的參數Application.Run(new Form1());

但我應該通過我不知道。 PLZ幫助如果有任何解決方案或任何其他方式從兒童獲得價值父母的形式。

這是我form3代碼現在我想用smileplay,surpriseplay,sadplay,normalplay,ambiguousplay的價值在Form1

Form1 m_parent; 
    public Form3(Form1 frm1) 
    { 
     InitializeComponent(); 
     m_parent = frm1; 
    } 

    private void Form3_Load(object sender, EventArgs e) 
    { 
     WMPLib.IWMPPlaylistArray allplaylist= m_parent.axWindowsMediaPlayer1.playlistCollection.getAll(); 
     for (int litem = 0; litem < allplaylist.count; litem++) 
     { 
     smilecombo.Items.Add(allplaylist.Item(litem).name); 
     surprisecombo.Items.Add(allplaylist.Item(litem).name); 
     sadcombo.Items.Add(allplaylist.Item(litem).name); 
     normalcombo.Items.Add(allplaylist.Item(litem).name); 
     ambiguouscombo.Items.Add(allplaylist.Item(litem).name); 
     } 
    } 

    private void savebtn_Click(object sender, EventArgs e) 
    { 
     WMPLib.IWMPPlaylist smileplay= m_parent.axWindowsMediaPlayer1.playlistCollection.getByName(smilecombo.SelectedItem.ToString()).Item(0); 
     WMPLib.IWMPPlaylist surpriseplay = m_parent.axWindowsMediaPlayer1.playlistCollection.getByName(surprisecombo.SelectedItem.ToString()).Item(0); 
     WMPLib.IWMPPlaylist sadplay = m_parent.axWindowsMediaPlayer1.playlistCollection.getByName(sadcombo.SelectedItem.ToString()).Item(0); 
     WMPLib.IWMPPlaylist normalplay = m_parent.axWindowsMediaPlayer1.playlistCollection.getByName(normalcombo.SelectedItem.ToString()).Item(0); 
     WMPLib.IWMPPlaylist ambiguousplay = m_parent.axWindowsMediaPlayer1.playlistCollection.getByName(ambiguouscombo.SelectedItem.ToString()).Item(0); 
    } 
+1

請參閱[我的答案](http://stackoverflow.com/a/15389047/2109503)到以前的問題。它將允許您訪問表單,而無需父母/孩子的必要性。具體的例子只是爲了提高可視性,你可以很容易地返回'TForm表單'或者只是使用這個概念。 – 2013-03-15 16:04:02

+0

這不起作用,因爲Form3也沒有0參數構造函數。 最簡單的事情 - 做一個沒有Form3參數的Form1的構造函數。 – 2013-03-15 16:04:57

回答

2

我想補充一個新的構造。

public Form3 : Form 
{ 
    public Form1 Parent { get; set; } 

    // TODO: Replace object with the proper type. 
    public object SomeComboboxValue 
    { 
        // TODO: Replace with the value you want to access. 
     get { return SomeComboBox.PropertyYouWantToAccess; } 
    } 

    public Form3() 
    { 
     InitializeComponent(); 
    } 

    public Form3(Form1 form1) 
    { 
     InitializeComponent(); 
     Parent = form1; 
    } 
} 

public Form1 : Form 
{ 
    private Form3 _form3; 

    public Form1() 
     :this(new Form3()) 
    { 
    } 

    public Form1(Form3 form3) 
    { 
     _form3 = form3; 
     _form3.Parent = this; 
    } 
} 

然後Application.Run(new Form1());將工作得很好。

+0

這裏的form1對象工作正常,但是當我想要從Form1訪問Form1中的組合框時,我無法使用_form3 – vidhi 2013-03-15 16:31:16

+0

您是否將組合框用作字段?你需要公開你希望其他對象作爲公共屬性訪問或使用'_form3.Controls'。我將在一個示例中進行編輯。 – Romoku 2013-03-15 16:34:20

+0

哦,我的錯誤我沒有設置修飾符屬性作爲公共現在它的工作.. – vidhi 2013-03-15 16:36:00

1
public Form1(Form3 frm3) 
{ 
    InitializeComponent(); 
    m_child = frm3; 
} 

您需要提供Form3對象初始化時Form1中

類似於:

Application.Run(new Form1(new Form3())); 

或者簡單的方法是創建兩個新的空構造函數。在C#中,當你創建一個構造函數時,你會鬆散默認的構造函數。

添加這兩個構造函數:

public Form1() 
{ 
    InitializeComponent(); 
} 

public Form3() 
{ 
    InitializeComponent(); 
} 
+0

不工作。 Form3在構造函數中需要Form1。 – Romoku 2013-03-15 16:08:11

+0

您需要創建兩個默認/空構造函數。在C#中,當你創建一個額外的構造函數時,你會鬆開默認的構造函數。 – 2013-03-15 16:11:10

+0

如果我使用Application.Run(新的Form1(新的Form3()));'那麼它顯示錯誤,form3不包含構造函數反向0參數bcos相反,我也創建form1 form1對象。 – vidhi 2013-03-15 16:14:56