2013-05-10 24 views
5

Tôi có một Điều khiển lblDate trong Điều khiển Người dùng MainScreen. Tôi muốn sửa đổi nó trong một phương thức trong lớp Date, trong một dự án khác AoWLibrary. Tôi không thể tham khảo nó vì AoWLibrary là một phụ thuộc của dự án đầu tiên.Sửa đổi Kiểm soát Biểu mẫu Windows từ một Dự án khác

tôi đã cố gắng để làm cho lblDate tĩnh nhưng trình biên dịch giữ ném lỗi tại tôi, và tôi có một tài sản nào đó ngày dường như không thể truy cập:

public Label LabelDate 
    { 
     get { return lblDate; } 
     set { lblDate = value; } 
    } 

Trong lớp ngày, tôi cần phương pháp CalculateDate công cộng để sửa đổi thuộc tính Văn bản của lblDate

public static void CalculateDate() 
    { 
     GameDate = month.ToString() + "/" + displayDay.ToString() + "/" + year.ToString(); 

    // LabelDate.Text = GameDate; 
    // This is essentially what I need to do 
    } 

Ngoài ra, tôi thậm chí không thể truy cập lblDate trong các điều khiển khác trong cùng một dự án.

+2

bạn có thể sửa đổi các điều khiển từ một lớp khác nếu bạn có một đối tượng được khởi tạo trong lớp bộ điều khiển. – lexeRoy

+0

Nhà thiết kế có tự động làm điều đó không? –

+0

Bạn có thể hiển thị mã (hoặc mẫu mã đủ), nơi bạn gọi một biểu mẫu khác không? – lexeRoy

Trả lời

1

Vì vậy, ý tưởng chung là bạn cần phải theo dõi những gì đang ở trong phạm vi. Có rất nhiều cách để đi về làm những gì bạn muốn làm, nhưng bất kỳ người trong số họ dựa vào các đối tượng tham chiếu lẫn nhau đúng cách theo cách bạn có thể chưa hoàn toàn hiểu đầy đủ. Đừng lo - mọi người đều phải làm việc này tại một thời điểm nào đó.

Lý do trình biên dịch bị khiếu nại khi bạn cố gắng làm cho thành viên đó tĩnh là vì bản thân nhãn không tĩnh. Được gắn với một cá thể của MainScreen, nó không có ý nghĩa trong một bối cảnh tĩnh, mà theo định nghĩa một phạm vi mà không có bất kỳ tham chiếu cố hữu nào đến một MainForm cụ thể.

Lớp Ngày của bạn, dĩ nhiên, cũng là một ngữ cảnh hoàn toàn khác, nhưng các thành viên không tĩnh của nó có quyền truy cập vào một phiên bản của Date. Không có bất kỳ con đường nào giữa hai bối cảnh này cho đến khi bạn tạo ra nó. Các tuyến đường tĩnh thực sự sẽ làm việc (tìm kiếm các mẫu Singleton: ý tưởng được rằng bạn lưu trữ trường hợp đầu tiên và duy nhất của một lớp tĩnh và tham khảo nó từ nơi khác) nhưng có lẽ không phải là thiết kế tốt. Các cách khác để làm điều này là bằng cách chuyển đến Date một thể hiện của MainScreen (tốt hơn là thông qua một giao diện) hoặc thậm chí là LabelDate. Tất cả những điều này có thể nhận được hai phần bạn cần cùng nhau để nói chuyện.

Tuy nhiên, tôi muốn đề xuất bạn nghĩ về vị trí trạng thái trò chơi của bạn đang được lưu trữ. Có phải trong thư viện hoặc hội đồng tiêu thụ? Nếu trước đây, bạn có thể muốn suy nghĩ về việc tạo ra một mô hình hoàn chỉnh GUIless của dữ liệu cần được lưu trữ và thao tác trong lớp thư viện và chỉ tiêu thụ dữ liệu sẵn sàng như trong ứng dụng chính. Cách khác là mô hình của bạn sống trong ứng dụng chính và chỉ cần gọi lại thư viện của bạn nếu cần. Trong trường hợp này, có lẽ bạn nên thanh toán ngay bây giờ để yêu cầu thư viện trả lời (hoặc nhiều nhất là lắng nghe các sự kiện trong thư viện) và KHÔNG mong đợi nó tự quay trở lại ứng dụng (cho dù nhận hay cung cấp thông tin).

Trong việc tìm ra cách thực hiện điều này, có thể bạn sẽ thấy các vấn đề về quản lý phạm vi của mình dễ xử lý hơn nhiều. Ngay cả một chút kiến ​​trúc tốt cũng có thể đi một chặng đường dài.

Nhưng nếu điều này là một chút áp đảo, đừng nhấn mạnh quá nhiều. Nghe có vẻ như bạn đang làm điều này cho vui, đó là một cách tuyệt vời để học. Bạn sẽ đi lên chống lại các vấn đề như thế này và sẽ đánh vào một thiết kế tốt hay không tốt, nhưng dù bằng cách nào bạn cũng vật lộn với các khái niệm quan trọng và sẽ trở nên tốt hơn cho nó.

+0

Tôi vừa kiểm tra Singleton và triển khai nó vào mã của tôi và tôi rất hài lòng với cách nó hoạt động. Cảm ơn lời khuyên của bạn. Nó sẽ là một trợ giúp lớn cho tôi. –

0

đúng LabelDate là từ lớp người dùng của bạnControl MainScreen, nhưng bạn không instatiating bất kỳ userControl .. Ví dụ của MainScreen bạn có muốn sửa đổi sau đó?

bạn nên làm

this.controlMainScreen.LabelDate = GameDate; 

xem xét rằng bạn nói trong bình luận của bạn, rằng bạn có

FormMain.Designer.cs there is: this.controlMainScreen = new Adventurers_of_Wintercrest.UserControls.MainScreen(); 
+0

Trong FormMain.Designer.cs có: this.controlMainScreen = new Adventurers_of_Wintercrest.UserControls.MainScreen(); Đó không phải là những gì cần phải xảy ra? –

+0

Xem chỉnh sửa của tôi. Điều này sẽ làm việc, tất nhiên, giả định rằng mã của bạn là trong FormMain (bạn không bao giờ chỉ định nó ở đâu) –

+0

bit đầu tiên tôi đăng là trong MainScreen.cs, mà là trong không gian tên Adventurers_of_Wintercrest.UserControls. Bit thứ hai nằm trong Date.cs, nằm trong không gian tên AoWLibrary. –

0

Tôi thà tư vấn cho bạn thực hiện phương pháp GameDate của bạn để trả về một chuỗi sau đó gọi nó từ dự án chính của bạn là về cơ bản là thư viện có ý nghĩa gì. ví dụ .:

public static string CalculateDate() 
{ 
    return month.ToString() + "/" + displayDay.ToString() + "/" + year.ToString(); 
} 

//in your main project 
LabelDate.Text = myLibrary.CalculateDate(); 

Đối với truy cập nó từ điều khiển khác trong cùng một dự án, bạn nên sử dụng một đại biểu - Cung cấp một đại biểu, thực hiện việc bổ sung, kê khai các đại biểu và gọi hàm từ CaculateDate của bạn. Ví dụ:

public delegate void dateSet(string); 

public void setDate(string date) 
{ 
    labelDate.Text = date; 
} 

sau đó trong phương pháp CaculateDate của bạn:

labeldate.Invoke(new MainForm.dateSet(), GameDate); 
+0

Đại biểu nên đi đâu? –

+0

Đại biểu phải được khai báo trong dự án chính của bạn nơi nhãn tồn tại. –

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