2012-07-02 31 views
6

Vì vậy, hiện giờ tôi không có nhiều manh mối, thậm chí không chắc chắn liệu nó có khả thi hay không. Tôi có một Visual C# Form, được chạy bởi Program.cs (Tiêu chuẩn cách - VS đã làm tất cả các công việc thiết lập của khóa học).Phương thức truy cập Biểu mẫu từ một lớp tĩnh khác

Ngoài ra, tôi có một lớp với một phương thức tĩnh trong một tệp C# riêng biệt, chỉ vì tôi muốn giữ một lớp trong một tệp.

mẫu mã của tôi có một chức năng công cộng:

public void print(String text) 
{ 
    rtb_log.appendText("\n" + text); 
} 

Tại một thời điểm nhất định, tôi gọi hàm tĩnh từ lớp khác.

Có thể, để thực sự truy cập phương thức in đó từ lớp khác của tôi không? Vì nó đề cập đến rtb_log (một hộp văn bản có định dạng), nó chỉ khả dụng nếu được kích hoạt, và tất nhiên là không tĩnh. Nhưng vì các phương thức tĩnh chỉ có thể truy cập các thành viên tĩnh, nên tôi có một chút ý tưởng ở đây về cách thêm một số văn bản vào biểu mẫu của tôi từ một lớp khác.

Mọi trợ giúp tại đây?

Trả lời

7

Nhưng vì các phương pháp tĩnh chỉ có thể truy cập các thành viên tĩnh, tôi có một chút ý tưởng ở đây về cách thêm một số văn bản vào biểu mẫu của tôi từ một lớp khác.

Thành viên tĩnh có thể truy cập thành viên cá thể - họ chỉ cần biết trường hợp nào cần gọi phương thức. Vì vậy, bạn có thể viết:

public static void Foo(OtherForm myOtherForm) 
{ 
    // Do some stuff... 
    myOtherForm.Print(); // Case changed to comply with naming conventions 
} 

Sau đó, khi bạn gọi phương pháp này, bạn cần phải cung cấp một tham chiếu đến các hình thức phù hợp. Về cơ bản nội dung nào đó phải xác định trường hợp nào bạn muốn gọi số Print. Làm việc với những người có thông tin đó và chuyển nó từ đó. Tôi sẽ giới thiệu chống lại bằng biến tĩnh để giữ thông tin này. (Trạng thái toàn cầu làm cho mã ít tái sử dụng, khó khăn hơn để lý do về, và khó khăn hơn để kiểm tra.)

EDIT: Căn cứ vào ý kiến, có vẻ như bạn muốn:

// Within the form 
private void HandleClick(object sender, EventArgs e) 
{ 
    SomeClass.StaticMethod(this); 
} 
+0

Tất nhiên, nhưng làm cách nào để truy cập vào cá thể biểu mẫu chính của tôi? Tôi đoán đó sẽ là câu hỏi mà tôi thực sự không nhận thức được. Có cách nào để truy cập vào trường hợp đó không? Nó được tạo trong phương thức chính của Program.cs, sử dụng standart (Form1 mới); Ngoài ra, cảm ơn vì đã chỉ ra lỗi đặt tên convetion của tôi và xem xét vấn đề mới bắt đầu của tôi một cách nghiêm túc :) – Eisenhorn

+1

@Klausklapper: Vâng, nếu 'Program' đang tạo một 'Form1 mới()' thì bạn có tham chiếu đến nó tại điểm đó .. nhưng những gì đang gọi phương pháp tĩnh của bạn? Để đặt nó theo một cách khác: nếu một cái gì đó tạo ra * nhiều * trường hợp của biểu mẫu của bạn, làm thế nào bạn sẽ mong đợi bất cứ điều gì để biết cái nào để gọi phương thức 'Print'? –

+0

Tôi ngu ngốc, tất nhiên là bạn đúng. Xin lỗi vì đã bị mù.Cảm ơn bạn rất nhiều! [đánh dấu câu trả lời của bạn ngay trong 1 phút vì nó sẽ không cho phép tôi sớm hơn>: C] – Eisenhorn

2

Xem dưới đây

class SomeMainClass 
{ 
    private ClassB form = null; 

    private void SomeMethod() 
    { 
     form = new ClassB(); 
     form.Show(); 
     ClassA foo = new ClassA(this); 
    } 

    // Use an accessor. 
    public ClassB Form 
    { 
     get { return this.form; } 
    } 
} 

class ClassA 
{ 
    private SomeMainClass mainClass = null; 

    // Constructor. 
    public ClassA(SomeMainClass _mainClass) 
    { 
     this.mainClass = _mainClass; 
    } 

    private void SomeMethod() 
    { 
     this.mainClass.Form.Print("Something to print"); 
    } 
} 

class ClassB : Form 
{ 
    // Constructor. 
    public ClassB() 
    { 
     InitializeComponent(); 
    } 

    public void Print(String text) 
    {  
     rtb_log.appendText("\n" + text); 
    } 
} 

Chỉnh sửa: Đây là phương pháp cơ bản để trả lời nhận xét của bạn. Nó không phải là hiệu quả về nguồn lực nhưng làm những gì bạn muốn ...

Tôi hy vọng điều này sẽ giúp ích cho bạn.

+0

Đáng buồn thay, nó không. Bạn thấy đấy, Form của tôi (trong trường hợp của bạn ClassB) được instanced tại Method.cs's Main Method, giống như cách đơn giản như mọi VC# GUI đơn giản. Tôi không có tên dụ trực tiếp. Hoặc ít nhất tôi không biết cách truy cập nó, kể từ Application.Run (Form1 mới()); không cung cấp cho tôi một ví dụ. Và ngay cả khi nó đã làm, tôi sẽ không thể truy cập nó từ lớp A của tôi, phải không? – Eisenhorn

+0

Xem chỉnh sửa để biết cách thực hiện điều này ... – MoonKnight

+0

Đã bỏ phiếu. Cảm ơn bạn một lần nữa :) – Eisenhorn

Các vấn đề liên quan