2013-06-01 38 views
5

Tôi đang cố gắng để thay đổi giá trị của một hộp văn bản nằm ởThay đổi hộp văn bản từ một lớp

public partial class Form1 : Form 

từ một lớp khác. Tôi đã thử một cái gì đó như thế này

public void echo(string text) 
{ 
    this.textBox1.AppendText(text + Environment.NewLine); 
} 

Từ một lớp Tôi gọi nó như

Form1 cout = new Form1(); 
cout.echo("Does this work?"); 

Và tôi nhận ra trống. Tôi cũng đã cố gắng thêm từ khóa static vào phương pháp echo, nhưng tôi đã nhận được kết quả tương tự. Tôi đã tìm kiếm trên Stack   Lỗi và không nhận được bất kỳ giải pháp nào để hoạt động. Và một điều kích hoạt tôi, nếu tôi thêm cout.Show() cùng một biểu mẫu bật ra với nội dung hợp lệ textBox1. Tại sao vậy?

Tại sao nó không hiển thị nội dung ngay lập tức? Và làm cách nào để khắc phục điều này?

Trả lời

10

Mỗi lần bạn nói mới Form1(), bạn đang tạo một trường hợp khác biệt và riêng biệt của hình thức đó.Thay vào đó, bạn cần phải tạo một biến trong lớp mà bạn đang cố truy cập biểu mẫu của mình. Ví dụ, chúng ta hãy vượt qua nó trong constructor:

public class MyClass { 
    public Form1 MyForm; 

    public MyClass(Form1 form){ 
     this.MyForm = form; 
    } 

    public void echo(string text) { 
     this.MyForm.textBox1.AppendText(text + Environment.NewLine);    
    } 

} 

Chú ý rằng bạn truy cập vào ví dụ cụ thể của Form1 trong phương pháp vang của bạn:

public void echo(string text) { 
    this.MyForm.textBox1.AppendText(text + Environment.NewLine); 
} 
+0

Aham, có đó. Tất cả các bạn đã cho tôi câu trả lời đúng và giải thích tại sao điều này lại xảy ra, nhưng vì nFreeze đã viết giải pháp cho điều này, tôi sẽ đánh dấu câu trả lời của anh ấy là chính xác. Cảm ơn tất cả! – Dejano

+1

Bạn cũng phải thay đổi "công cụ sửa đổi" thành "Công khai" cho hộp văn bản. – Hadron

4

Vấn đề là ở đây:

Form1 cout = new Form1() ; 
cout.echo("Does this work?"); 

Bạn đang tạo ra một phiên bản mới của hình thức chính của bạn, Form1.

Lớp khác này là gì và làm cách nào để được khởi tạo?

Bạn có hai lựa chọn:

  1. Khi mã của bạn trong Form1 tạo ra lớp, cho anh ta một ví dụ để this, và gọi phương thức echo của bạn vào đó tham chiếu đến (duy nhất) thể hiện của Form1.

  2. Thêm event vào lớp khác này, được kích hoạt khi anh ấy muốn cung cấp một số thông tin. Mã số Form1 của bạn sẽ đăng ký trình xử lý sự kiện trên sự kiện này và thực hiện cuộc gọi tới số echo khi sự kiện xảy ra.

0

Bạn đang tạo hoàn toàn mới Form1. Lý do xuất hiện khi bạn gọi Show() là vì bạn đang hiển thị cửa sổ mới mà bạn đã thực hiện. Tôi không chắc ý định thực sự của bạn là gì, bởi vì tôi không biết bạn đang gọi từ đâu, nhưng điều bạn muốn làm là gọi echo cho số Form1 đã được tạo.

1

Thay vì cout hãy thử sử dụng MessageBox.Show("Does this work?");

Bây giờ gửi giá trị textbox từ dạng này sang dạng khác.

protected void btnNext_Click(object sender, EventArgs e) 
{ 
    MyForm2 x = new MyForm2(); 
    x.Query = "My Query"; // here "Query" is your custom public string variable on form2 
    x.Show() 
} 
1

Bạn không cần tạo đối tượng Form1 khác.

Hãy thử mã này và tôi nghĩ rằng, bạn sẽ đoán những gì đang xảy ra:

Form1 cout = new Form1(); 
cout.Show(); 
cout.echo("Does this work?"); 
Các vấn đề liên quan