2013-02-02 54 views
5

Tôi đang cố gắng hiểu sự khác biệt giữa thuộc tính tĩnh và công khai. Nhưng khi tôi cố gắng truy cập tài sản công cộng của tôi 'Test' ở dạng khác, nó nói 'null'.C# winform: Truy cập các thuộc tính công khai từ các biểu mẫu khác và khác biệt giữa thuộc tính tĩnh và công khai

Heres Form1:

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

    private string _test; 

    public string Test 
    { 
     get { return _test; } 
     set { _test = value; } 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     _test = "This is a test"; 
    } 

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

Dưới đây là Form2:

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

    private void Form2_Load(object sender, EventArgs e) 
    { 
     Form1 frm1 = new Form1(); 
     label1.Text = frm1.Test; 
    } 
} 

Để kiểm tra giá trị của 'thử nghiệm' trong Form1, tôi đặt một breakpoint vào dòng này:

label1.Text = frm1.Test; 

Nhưng giá trị là 'null'.

Vui lòng giúp tôi làm cách nào để tôi có thể truy cập các thuộc tính công khai với các biểu mẫu khác.

Và BTW tôi đã cố gắng biến thuộc tính công khai này thành 'tĩnh công khai'. Tôi có thể truy cập thông tin này bằng cách sử dụng:

Form1.Test 

Nhưng tôi nhận thấy rằng tôi có thể thay đổi giá trị 'Thử nghiệm' từ Form2 mà tôi không muốn xảy ra. Đó là lý do tại sao tôi đang cố gắng sử dụng tài sản công cộng nhưng không có may mắn. Ai đó có thể làm rõ cho tôi những điều này. Cảm ơn vì tất cả sự giúp đỡ của mọi người!

EDIT: (For follow up question) 

Câu trả lời của Sir John Koerner là câu trả lời hay nhất cho câu hỏi của tôi. Nhưng tôi có một câu hỏi tiếp theo, tôi đã cố gắng làm cho các thuộc tính 'thử nghiệm' này thành 'tĩnh' và tôi nhận thấy rằng ngay cả khi tôi làm cho thuộc tính này là thuộc tính tĩnh hoặc công khai, vẫn có thể chỉnh sửa trong Form2. Để làm cho bản thân mình rõ ràng đây là một ví dụ:

public partial class Form2 : Form 
{ 
    private Form1 f1; 
    public Form2(Form1 ParentForm) 
    { 
     InitializeComponent(); 
     f1 = ParentForm; 
    } 

    private void Form2_Load(object sender, EventArgs e) 
    { 
     label1.Text = f1.Test; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     f1.Test = "This test has been changed!"; 

     this.Close(); 
    } 
} 

Sau Form2 đóng cửa, tôi đã cố gắng để phá vỡ một lần nữa trong Form1_Load để kiểm tra giá trị của 'Test', và nó đã thay đổi! Làm cách nào để tôi có thể tạo thuộc tính công khai trong Form1 thành readOnly trong Form2 và không thể được chỉnh sửa? Làm ơn cho tôi biết. Cám ơn mấy đứa nhiều!

Trả lời

6

Thuộc tính của bạn là biến mẫu, do đó giá trị có thể khác nhau giữa các trường hợp khác nhau là Form1.

Nếu bạn đang cố gắng truy cập các biến mẫu từ một biểu mẫu gốc, cách dễ nhất để làm điều đó là chuyển Form1 vào hàm tạo của Form2.

public partial class Form2 : Form 
{ 
    private Form1 f1; 
    public Form2(Form1 ParentForm) 
    { 
     InitializeComponent(); 
     f1 = ParentForm; 
    } 

    private void Form2_Load(object sender, EventArgs e) 
    { 
     label1.Text = f1.Test; 
    } 
} 

Sau đó, khi bạn tạo một Form2 mới từ Form1, bạn có thể làm điều này:

Form2 frm2 = new Form2(this); 

Nếu bạn muốn tài sản của mình để được chỉ đọc, bạn có thể đơn giản là không thể chỉ định một setter:

public string Test 
{ 
    get { return _test; } 
} 
+0

Cảm ơn người đàn ông này, xin vui lòng xem chỉnh sửa của tôi cho câu hỏi tiếp theo của tôi, tôi hy vọng tôi làm cho câu hỏi của tôi rõ ràng. – jomsk1e

+0

@JRC xem chỉnh sửa của tôi. –

+0

là thế! cảm ơn sự giúp đỡ của bạn John! Bài học hay từ bạn! Xin lỗi vì là một newbie :( – jomsk1e

0

frm1 không phải là đối tượng chính của bạn. Đây là đối tượng mới tạo nơi thuộc tính Test khởi chạy khi nó tải (trong số Form1_Load trình xử lý sự kiện).

0

Các trường hợp đầu tiên của Form1 cho thấy một thể hiện của Form2, và sau đó Form2 tạo khác thể hiện của Form1.Điều này có thể hiệu quả, nhưng bạn đặt _test trong sự kiện Form.Load, trong đó:

Xảy ra trước khi biểu mẫu được hiển thị lần đầu tiên.

Bạn không hiển thị trường hợp của Form1 bạn đang cố gắng để đọc Test từ, vì vậy sự kiện Load của nó sẽ không xảy ra và Test vẫn null.

Bạn có thể thêm quá tải hàm xây dựng hoặc thuộc tính để chuyển tham chiếu Form1 dưới dạng @JohnKoerner đề cập đến, nhưng tôi muốn chỉ chuyển biến được yêu cầu, thậm chí có thể đóng gói trong một sự kiện, để giảm khớp nối. Form2 thường không cần biết tất cả về Form1.

-1

công

Loại hoặc thành viên có thể được truy cập bởi bất kỳ mã khác trong cùng một assembly, lắp ráp khác tham chiếu đến nó.

tĩnh

Các modifier tĩnh trên một lớp học có nghĩa là các lớp không thể được khởi tạo, và rằng tất cả các thành viên của nó là tĩnh. Một thành viên tĩnh có một phiên bản bất kể bao nhiêu phiên bản của kiểu kèm theo của nó được tạo ra.

Lớp tĩnh về cơ bản giống như một lớp không tĩnh, nhưng có một sự khác biệt: một lớp tĩnh không thể được khởi tạo từ bên ngoài. Nói cách khác, bạn không thể sử dụng từ khóa mới để tạo biến của loại lớp. Vì không có biến mẫu, bạn truy cập các thành viên của một lớp tĩnh bằng cách sử dụng tên lớp của chính nó.

Tuy nhiên, có một thứ như một hàm tạo tĩnh. Bất kỳ lớp nào cũng có thể có một lớp, bao gồm các lớp tĩnh. Chúng không thể được gọi trực tiếp & không thể có tham số (trừ bất kỳ tham số kiểu nào trên chính lớp đó). Một hàm tạo tĩnh được gọi tự động để khởi tạo lớp trước khi cá thể đầu tiên được tạo ra hoặc bất kỳ thành viên tĩnh nào được tham chiếu. Trông như thế này:

lớp tĩnh Foo() { tĩnh Foo() { Bar = "fubar"; }

public static string Bar { get; set; } 

}

lớp tĩnh thường được sử dụng như các dịch vụ, bạn có thể sử dụng chúng như vậy:

MyStaticClass.ServiceMethod (...);

1

Sử dụng phương pháp này 'tĩnh'

Tại Modifiers sở hữu nhãn kiểm soát đầu tiên = Công

trong mã chương trình dưới đây

public static Form1 frm1 = new Form1(); 
public static Form2 frm2 = new Form2(); 

trong mã Form1 dưới

Program.frm2.show(); 

trong Mã Form2 bên dưới

label1.Text=Program.frm1.text; 
Các vấn đề liên quan