2009-02-23 32 views
7

NềnLàm thế nào để tránh Windows Forms nút radio chứa auto nhóm

Trong .NET Windows Forms (2.0) nút radio sẽ tự động được nhóm lại bằng cách điều khiển container của họ, cho dù đó là một mẫu, Panel hoặc GroupBox.

Điều đó có nghĩa là khi bạn chọn một nút radio, mọi nút radio khác trong cùng một vùng chứa sẽ tự động được thay đổi thành trạng thái không được chọn.

Bây giờ, hãy xem xét cách bố trí hình thức sau đây:

MUST HAVE NICE TO HAVE DESCRIPTION 
--------- ------------ ----------------------------------------------- 
    [ ]   [ ]  The gizmo works 
    [ ]   [ ]  The gizmo works beautifully 
    [ ]   [ ]  The gizmo works amazingly and makes you breakfast 
    [ ]   [ ]  The gizmo comes with a pony 
  • Mỗi '[ ]' là một nút radio.
  • Người dùng được yêu cầu chọn cần câu trả lời trong một cột, và các tùy chọn (mong muốn, nhất trường hợp câu trả lời) trong cột 2.

Như bạn có thể thấy, các nút radio nên được nhóm theo cột: chọn một trong các radio nên xóa phần còn lại của cột, nhưng sẽ không có hiệu lực trong cột khác.

Vấn đề

Về cơ bản vấn đề là đây là một hình thức tạo động.

  • Số hàng trong bố cục động và được tải từ định nghĩa biểu mẫu có thể định cấu hình.
  • Văn bản mô tả không được biết đến cho đến khi thời gian chạy và độ dài thay đổi rất nhiều (một số có thể chỉ có một vài từ và một vài dòng khác).
  • Bố trí không thể được thiết kế lại. Điều này xuất phát từ sự quen thuộc của người dùng (phi kỹ thuật) với phiên bản giấy của biểu mẫu này đã được sử dụng trong nhiều năm. Biểu mẫu này cũng sẽ được in và thậm chí nếu tôi thay đổi hệ thống đầu vào trên biểu mẫu của tôi, điều đó có nghĩa là mã hóa một phiên bản khác để in bằng bố cục 'cũ'.

Những gì tôi đã cố gắng và đã không làm việc

đầu tiên tôi đã cố gắng để thực hiện điều này như một bố cục tạo động sử dụng ba tấm, một cho mỗi cột, vì vậy nút radio tự động nhóm sẽ làm việc chỉ khỏe. Và nó đã làm.

Nhưng vấn đề bố cục liên quan đến căn chỉnh ngang giữa các nút radio và văn bản của nó chỉ là giết tôi. Kích thước của văn bản không được biết cho đến khi thời gian chạy và các dòng văn bản có thể bọc (đôi khi nhiều lần cho mỗi mục). Đôi khi nó phù hợp đúng cách, đôi khi nó không. Tôi sắp bắt đầu gỡ lỗi này, nhưng tôi nghĩ nếu có thể thay đổi việc triển khai ba bảng này là một lựa chọn tốt hơn.

Những gì tôi đang cố gắng để làm

Tôi muốn thiết kế lại cách bố trí bằng cách sử dụng một TableLayoutPanel với ba cột để đơn giản hóa các vấn đề liên kết liên quan, nhưng điều đó có nghĩa là tôi không thể sử dụng đài phát thanh tự động nút "từng nhóm" tính năng "".

EDIT:

Như Gerrie gợi ý, tùy chọn bố trí khác là phải có mỗi dòng thực hiện như một điều khiển người dùng và sử dụng một bảng điều khiển bố trí dòng chảy.

Điều đó có nghĩa, một lần nữa, tôi có thể muốn sử dụng các điều khiển cho bố cục, nhưng không phải để nhóm nút radio.

tôi sẽ cần phải nhận được nhóm nút radio dọc mặc dù sử dụng sử dụng ngang điều khiển

/EDIT

Những gì tôi đang cố gắng để hỏi

Tôi cần gợi ý và gợi ý về cách để điều khiển nhóm các nút radio theo cách thủ công. Tôi thực sự không ngại phân lớp lớp RadioButton nếu cần.

Cụ thể, có cách nào 'chuẩn' hoặc biết cách phân lớp 'RadioButton' hoặc chuyển xuống API Win32, để mỗi lần kiểm soát được kiểm tra (bằng cách sử dụng chuột, bàn phím Enter, thanh Space, và bất kỳ cách nào khác mà tôi không thể nhận thức được lựa chọn chúng) Tôi có thể bẫy sự kiện và cập nhật trạng thái của mọi điều khiển khác trên biểu mẫu của tôi theo cách thủ công và theo cách thức tính năng nhóm tự động được biết là 'không kích hoạt' ? Tôi sợ rằng việc thực hiện cũng liên quan đến container, và tôi cũng có thể buộc phải phân lớp Panel ?.

Cách nhóm 'ma thuật' hoạt động trong Windows Forms?

Mọi giải pháp tôi tìm thấy googling thực hiện các nhóm nút radio tùy chỉnh hoặc 'danh sách nút radio' dựa trên một số cách sử dụng vùng chứa cho nhóm. Thùng chứa có thể tránh được không? Nếu vậy, làm thế nào ?.

Trả lời

6

Một giải pháp tạm thời (đọc: lộn xộn Hack) tôi thấy là tôi đang đặt mỗi và mỗi nút radio trong bảng nhỏ của riêng mình. Vì vậy, không có nhóm nào xảy ra giữa bất kỳ ai trong số họ. Tôi đang nghe từng nút checked sự kiện và cập nhật các sự kiện phù hợp.

Tôi vẫn nghĩ rằng nó quá cần thiết để có nhiều bảng điều khiển và nếu có ai có giải pháp sạch hơn, tôi rất muốn nghe nó.

(OK, xin lỗi vì đã trả lời câu hỏi của riêng tôi. Bạn biết rằng khi bạn dành thời gian để giải thích một cái gì đó bạn bắt đầu nhìn thấy những vấn đề đó một ánh sáng khác nhau.)

+0

Nếu bạn đang đi với giải pháp này, sau đó nó sẽ là một thời điểm tốt để tạo ra một radiobutton riêng mà không phải có trong một bảng điều khiển. Và khi bạn đang ở đó, thêm một GroupID thuộc tính tùy chọn, được gửi trở lại khi toggled. – Stefan

+0

Một lần nữa, cảm ơn sự giúp đỡ của bạn Stefan. Nhân tiện, tôi đã thực hiện một lớp IndependentRadioButton nhưng nó đã không xảy ra với tôi chưa thêm thuộc tính GroupId ngay tại đó. Âm thanh vừa phải. –

+0

Kiểm tra chỉnh sửa câu trả lời của tôi để biết thêm một số ý tưởng. –

1

Tôi sẽ đi cho một giải pháp đơn giản và dễ hiểu. Ví dụ, một điều khiển tùy chỉnh đại diện cho một dòng (vì vậy hai nút radio và một nhãn).

EDIT: OK, tôi nghĩ rằng tôi hiểu yêu cầu của bạn ngay bây giờ. Bạn không thể chỉ có hai bộ sưu tập radiobutton: những cái trong cột A và những cái trong cột B?

Khi biểu mẫu của bạn được vẽ, hãy thêm chúng vào hai Danh sách < RadioButton> hoặc bất kỳ thứ gì và liên kết chúng thành hai sự kiện riêng biệt: columnARBChecked, columnBRBChecked. Khi một trong những sự kiện cháy, bạn có thể gọi một số logic để kiểm tra/bỏ chọn phần còn lại của các nút radio như bạn vui lòng.

+0

Điều đó sẽ làm việc thay cho TableLayoutPanel cho các mục đích bố trí, chắc chắn rồi. Vấn đề với giải pháp này là các nút bên trong điều khiển người dùng sẽ vẫn được nhóm bên trong điều khiển người dùng.Vì vậy, tôi sẽ có nhiều nhóm như trường hợp kiểm soát người dùng thay vì 2 nhóm (một nhóm cho mỗi cột). –

+0

Sau đó, tôi e rằng tôi không hiểu hoàn toàn yêu cầu của bạn. Bạn muốn nhóm ngang phải không? Tại sao bạn muốn tấm dọc cũng? Tại sao bạn không thể lặp lại tập hợp các điều khiển tùy chỉnh và đọc nút radio nào được chọn ở đó? –

+0

Xin lỗi, tôi sẽ chỉnh sửa câu hỏi để làm rõ rằng trong thực tế nhóm ngang (đó là những gì sẽ xảy ra theo mặc định) không phải là những gì tôi cần, nhưng nhóm dọc. cảm ơn. –

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