2011-01-27 111 views
9

我有兩個Form類,其中一個有ListBox。我需要ListBoxSelectedIndex財產的籌碼,我想從第二個Form撥打電話。如何訪問另一個窗體的窗體控件?

目前我做了以下內容:

表1

public int MyListBoxSelectedIndex 
{ 
    set { lsbMyList.SelectedIndex = value; } 
} 

表2

private ControlForm mainForm; // form 1 

public AddNewObjForm() 
{ 
    InitializeComponent(); 
    mainForm = new ControlForm();   
} 

public void SomeMethod() 
{ 
    mainForm.MyListBoxSelectedIndex = -1; 
} 

這是做到這一點的最好方法是什麼?

+0

[形式之間的相互作用 - 如何改變從另一種形式的形式的控制(https://stackoverflow.com/a/38769212/3110834) – 2017-11-04 21:13:58

回答

2

我通常使用Singleton Design Pattern來設計類似http://en.wikipedia.org/wiki/Singleton_pattern的東西。我將製作應用程序在單例下運行的主窗體,然後創建訪問器以訪問我想在其他區域中訪問的窗體和控件。然後,其他表單可以獲取指向他們想要修改的控件的指針,或者獲取他們希望更改的應用程序主要部分中的數據。

另一種方法是在不同的窗體上設置事件以進行通信,並使用主窗體作爲排序中心將事件消息從一種窗體傳遞到應用程序內的另一種窗體。

+0

你爲什麼不只是使用事件?這就是它們的目的,沒有緊密耦合的對象之間的通信。 – 2011-01-28 00:33:25

+0

@Ed Swangren - 這就是我爲什麼給他們建議的原因。這完全是一種選擇,儘管需要更多的時間來完成每個單獨的事件,因爲您希望添加新的鉤子,而單例是非常單一的事情。我最喜歡做的事情是將UI從應用程序的核心行爲中抽象出來。那核心就是單身人士,並且可以附加事件。那麼所有的用戶界面只是核心內數據的一個視圖。這使得撤銷/重做行爲變得容易得多。 – ColinCren 2011-01-28 01:56:28

+0

我沒有看到撤消重做行爲的任何要求,我不同意你的陳述,這意味着處理事件是一項繁重的任務。單身人士通常是任何問題的蹩腳解決方案。我打算列出一些支持性論點,我在這裏找到了一個相當不錯的列表:http://blogs.msdn.com/b/scottdensmore/archive/2004/05/25/140827.aspx – 2011-01-28 08:26:07

19

讓他們成爲單身並不是一個完全壞主意,但我個人並不喜歡這樣做。我寧願將一個引用傳遞給另一個表單。這是一個例子。

Form1觸發Form2打開。 Form2重載了構造函數,它將調用窗體作爲參數並提供對Form2成員的引用。這解決了通信問題。例如,我已經將Form1中的Label Property公開爲Form2中的Form1。

通過這種方法,您可以以不同的方式進行溝通。

Download Link for Sample Project

// 你Form1中

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     Form2 frm = new Form2(this); 
     frm.Show(); 
    } 

    public string LabelText 
    { 
     get { return Lbl.Text; } 
     set { Lbl.Text = value; } 
    } 
} 

// 你的窗體2

public partial class Form2 : Form 
{ 
    public Form2() 
    { 
     InitializeComponent(); 
    } 

    private Form1 mainForm = null; 
    public Form2(Form callingForm) 
    { 
     mainForm = callingForm as Form1; 
     InitializeComponent(); 
    } 

    private void Form2_Load(object sender, EventArgs e) 
    { 

    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     this.mainForm.LabelText = txtMessage.Text; 
    } 
} 

alt text http://demo.ruchitsurati.net/files/frm1.png

​​

1

訪問形式的控制是這樣的:formname.controls[Index]
您可以強制轉換爲相應的控制類型,例如:
DataGridView dgv = (DataGridView) formname.Controls[Index];

1

這很容易,首先你可以訪問其他的形式是這樣的: (假設你的另一種形式是Form2

//in Form 1 
Form2 F2 = new Form2(); 
foreach (Control c in F2.Controls) 
     if(c.Name == "TextBox1") 
      c.Text = "hello from Form1"; 

這它,你只需在TextBox1Form1寫入。

1

還有一種方法,如果你不想循環像Joe Dabones所建議的「ALL」控件。 在Form2中創建一個函數並從Form1調用它。

public partial class Form2 : Form 
{ 
    public Form2() 
    { 
     InitializeComponent(); 
    } 

    public void SetIndex(int value) 
    { 
     lsbMyList.SelectedIndex = value; 
    } 
} 

public partial class Form1 : Form 
{ 
    public Form2 frm; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     frm=new Form2(); 
     frm.Show(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     frm.SetIndex(Int.Parse(textBox1.Text)); 
    } 
} 
相關問題