2011-01-27 42 views
9

Tôi có hai lớp Form, một trong số đó có ListBox. Tôi cần người lập hóa đơn cho tài sản SelectedIndex của số ListBox, mà tôi muốn gọi từ số Form thứ hai.Cách truy cập điều khiển biểu mẫu cho biểu mẫu khác?

Hiện nay tôi đang làm như sau:

Mẫu 1

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

Mẫu 2

private ControlForm mainForm; // form 1 

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

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

Đây có phải là cách tốt nhất để làm điều này?

+0

[Tương tác giữa các loại hình - Làm thế nào để thay đổi một điều khiển của một hình thức từ hình thức khác] (https://stackoverflow.com/a/38769212/3110834) –

Trả lời

2

Tôi thường sử dụng Mẫu thiết kế Singleton cho một cái gì đó như thế này http://en.wikipedia.org/wiki/Singleton_pattern. Tôi sẽ làm cho các hình thức chính mà các ứng dụng đang chạy theo singleton, và sau đó tạo accessors để hình thức và điều khiển tôi muốn liên lạc trong các lĩnh vực khác. Các hình thức khác sau đó có thể có được một con trỏ đến điều khiển mà họ muốn sửa đổi, hoặc dữ liệu trong phần chính của ứng dụng mà họ muốn thay đổi.

Cách tiếp cận khác là thiết lập sự kiện trên các biểu mẫu khác nhau để liên lạc và sử dụng biểu mẫu chính làm trung tâm sắp xếp để chuyển các thông báo sự kiện từ biểu mẫu này sang biểu mẫu khác trong ứng dụng.

+0

Tại sao bạn sẽ không chỉ cần sử dụng các sự kiện? Đây là những gì họ đang có, giao tiếp giữa các đối tượng mà không cần khớp nối chặt chẽ. –

+0

@Ed Swangren - Đó là lý do tại sao tôi cũng đề xuất chúng. Nó hoàn toàn là một lựa chọn, mặc dù nó đòi hỏi một toàn bộ rất nhiều thời gian hơn để làm mỗi sự kiện cá nhân như bạn muốn thêm móc mới, trong khi một singleton là khá nhiều một điều một thời gian. Điều yêu thích cá nhân của tôi là làm trừu tượng giao diện người dùng khỏi hành vi cốt lõi của ứng dụng. Cốt lõi đó là singleton, và có thể có sự kiện gắn liền với nó. Sau đó, tất cả giao diện người dùng chỉ là chế độ xem dữ liệu trong lõi. Điều này làm cho việc hoàn tác/làm lại các hành vi dễ dàng hơn nhiều. – ColinCren

+0

Tôi không thấy bất kỳ yêu cầu nào về hành vi hoàn tác lại và tôi không đồng ý với tuyên bố của bạn ngụ ý rằng việc thiết lập sự kiện là một nhiệm vụ khó khăn. Singletons thường là một giải pháp crappy cho bất kỳ vấn đề. Tôi sẽ liệt kê một số đối số hỗ trợ, tôi tìm thấy một danh sách khá hay ở đây: http://blogs.msdn.com/b/scottdensmore/archive/2004/05/25/140827.aspx –

19

Làm cho chúng Singleton không phải là một ý tưởng hoàn toàn tồi, nhưng cá nhân tôi sẽ không thích làm theo cách đó. Tôi muốn chuyển tài liệu tham khảo của một hình thức khác. Đây là một ví dụ.

Trình kích hoạt Form1 Form2 để mở. Form2 có quá trình khởi tạo quá tải, có dạng gọi là đối số và cung cấp tham chiếu tới các thành viên Form2. Điều này giải quyết vấn đề giao tiếp. Ví dụ tôi đã tiếp xúc với Thuộc tính nhãn là công khai trong Form1 được sửa đổi trong Form2.

Với cách tiếp cận này, bạn có thể thực hiện giao tiếp theo nhiều cách khác nhau.

Download Link for Sample Project

// Form1 bạn

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

// Form2 bạn

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

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

+1

-1, các sự kiện là giải pháp tốt hơn nhiều. –

+1

Đây là cách tốt nhất để đi. –

+6

@EdS. : Bạn có thực sự giải quyết một giải pháp bởi vì bạn không nghĩ rằng đó là giải pháp tốt nhất? Tôi hy vọng không phải vì đây là một giải pháp hoàn toàn hợp lệ và làm việc. – Tipx

1

Truy cập các điều khiển của biểu mẫu như sau: formname.controls[Index].
Bạn có thể đúc kiểu kiểm soát như thích hợp, ví dụ:
DataGridView dgv = (DataGridView) formname.Controls[Index];

1

Thật dễ dàng, trước tiên bạn có thể truy cập các hình thức khác như thế này: (giả sử các hình thức khác của bạn là Form2)

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

Đó là nó, bạn chỉ cần viết trong TextBox1 trong Form2 từ Form1.

+0

Một chủ đề liên quan tốt: https://stackoverflow.com/a/1499088/4439444 – GntS

1

Có một cách khác, trong trường hợp bạn không muốn lặp qua các điều khiển "TẤT CẢ" như Joe Dabones được đề xuất. Thực hiện một chức năng trong Form2 và gọi nó từ 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)); 
    } 
} 
Các vấn đề liên quan