2010-01-18 50 views
8

tôi có biểu mẫu lưu trữ một tabcontrol. mỗi tab này có nhiều điều khiển khác nhau, từ hộp văn bản, combobox, treecontrol, điều khiển quay.thay đổi theo dõi trong biểu mẫu chiến thắng C#

Trên đầu biểu mẫu có hộp văn bản.

nếu có bất kỳ thay đổi nào được thực hiện bằng các điều khiển của biểu mẫu cho biết giá trị được thay đổi trong hộp kết hợp của tab 1 hoặc mục đã bị xóa khỏi điều khiển cây tôi cần hiển thị dấu "*" đã thay đổi.

Làm thế nào tôi có thể đạt được điều này một cách hiệu quả? hoặc đang xử lý sự hồi đáp. điều khiển sự kiện đã thay đổi cách duy nhất để biết liệu một mục có bị thay đổi hay không?

+0

Nó có thể giúp bạn hiểu thêm về cách bạn sử dụng thông tin đã thay đổi trạng thái trên một TabPage cụ thể: nếu đã có cài đặt kiểm soát/thay đổi thuộc tính, bạn có làm gì không trước khi người dùng được phép chuyển sang một TabPage khác? Giống như tuần tự hóa các điều khiển, lưu dữ liệu thuộc tính theo một cách nào đó? Câu trả lời của câu trả lời của TommieB cung cấp cho bạn dưới đây cho một bài viết CodeProject là một bài viết rất hay, vì bài báo minh họa ba chiến lược khác nhau để theo dõi sự thay đổi trạng thái. – BillW

Trả lời

4

Tôi nghĩ rằng bài viết này trên Codeproject có thể giúp bạn, nó hỗ trợ trong việc theo dõi các thay đổi trong điều khiển biểu mẫu thắng.

Hy vọng điều này sẽ hữu ích.

+0

Bài viết hay !!!!! – gbianchi

1

Điều này phụ thuộc hoàn toàn vào kiến ​​trúc cơ bản của phần mềm của bạn. Nếu nó được viết theo cách ngây thơ, thì có, một số dạng bạo lực chỉ là cách duy nhất bạn có thể đi (và điều đó, tất nhiên, sẽ chỉ làm cho mã tồi tệ hơn nhiều - đây là lý do tại sao cấu trúc tốt là quan trọng).

Nếu, mặt khác, phần mềm đã được thiết kế hợp lý, sau đó bạn sẽ có các đối tượng phía sau giao diện người dùng theo dõi trạng thái giao diện người dùng. Các đối tượng này có thể thực hiện một cái gì đó như INotifyPropertyChanged và bạn có thể tận dụng điều đó với cơ chế ánh xạ để cập nhật giao diện người dùng cho các trường đã thay đổi.

Tôi nghi ngờ bạn rơi vào tình huống đầu tiên, mặc dù, bất kỳ câu trả lời hay nào cho vấn đề của bạn đã bị loại bỏ lâu trước những gì bạn đang cố gắng làm bây giờ. Tôi suy ra điều này từ tuyên bố của bạn rằng biểu mẫu "lưu trữ tabcontrol" và "mỗi tab này có nhiều điều khiển ..." Đây là giao diện người dùng mà tôi đã thấy thời gian và thời gian từ người nghèo nhà thiết kế.

+0

Tại sao bạn mô tả các điều khiển tab có chứa một số điều khiển khác như một antipattern? Thiết kế-khôn ngoan, làm thế nào bạn sẽ refactor đó? –

+1

@Neil: UserControl (s). Tôi đã thấy hàng tấn phần mềm khủng khiếp có thể kiểm soát trực tiếp trên các tab, về cơ bản tạo ra 'Form1' (nó gần như chắc chắn có tên là' Form1') một thùng chứa toàn cục cho tất cả các trạng thái trừu tượng. Các thành viên trong Form1 được sử dụng như trạng thái toàn cầu (freq., Ngay cả tiền tố với 'glb'). Tôi có thể nghĩ về một phần mềm cụ thể mà công ty của tôi bán với giá $ 10k/giấy phép bị lạm dụng một phần các lớp để truyền Form1 trên 11 tệp với các điều khiển như 'textBox74'. Có, có hơn 74 hộp văn bản. –

+1

Cái mà tôi đã làm với cái gọi là 'frmMain'. Họ để lại 'Form1' trong dự án, và mục đích duy nhất của' Form1' là hiển thị 'frmMain' và sau đó đóng lại. –

1

Bạn có thể thử điều gì đó dọc theo các dòng này, bạn sẽ cần phải thêm một chút cho từng loại điều khiển trên biểu mẫu của mình. Trên sự kiện tải của bạn từ một addUpdateNotification (điều này);

public void addUpdateNotification(Control start) 
    { 
     foreach (Control c in start.Controls) 
     { 
      if (c is TextBox) 
      { 
       var text = c as TextBox; 
       text.TextChanged += notifyChanged; 
      } 

      addUpdateNotification(c); 
     } 
    } 

    public void notifyChanged(Object sender, EventArgs args) 
    { 
     UpdateTextBox.Text = "*"; 
    } 
+1

@BillW bạn có chắc chắn không? Nó đi qua tất cả các trẻ em của mọi điều khiển bắt đầu với sự kiểm soát bắt đầu. Việc đệ quy vô hạn sẽ chỉ xảy ra nếu một đứa trẻ kiểm soát có một trong số đó là cha mẹ khi còn nhỏ và mã trong bài viết đó có vẻ sẽ bị nghẹt thở trong cùng một tình huống (tôi thậm chí không chắc chắn nếu tình huống đó có thể xảy ra). – BarrettJ

+0

@ Tester101 cố định, nên đã được sử dụng trên dòng tiếp theo thay vì c.TextChanged – BarrettJ

+0

@BarretJ Lời xin lỗi của tôi, mã của bạn không tạo đệ quy: Tôi vi phạm chính sách của riêng tôi không bình luận về mã tôi đã không kiểm tra cá nhân: sẽ dạy tôi! – BillW

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