2008-11-01 36 views
5

Quay lại WinForms trong VS2008 sau một thời gian dài .. Nháy mắt với sự cố OOD trong VS2008 Express Edition.Làm cách nào để tạo điều khiển Windows Biểu mẫu chỉ đọc?

Tôi cần một số điều khiển để trở thành tiện ích "chỉ hiển thị". Người dùng không thể thay đổi giá trị của các điều khiển này ... các tiện ích con được cập nhật bằng sự kiện đánh dấu cập nhật định kỳ. Tôi mơ hồ nhớ có một tài sản ReadOnly mà bạn có thể thiết lập để có hành vi này ... không thể tìm thấy nó ngay bây giờ.

Đã bật thuộc tính được đặt thành false: làm xám nội dung kiểm soát. Tôi muốn kiểm soát trông bình thường. Khóa thuộc tính được đặt thành false: có vẻ như đang bảo vệ người dùng khỏi vô tình bóp méo điều khiển trong Trình thiết kế biểu mẫu trực quan.

Tôi đang thiếu gì?

+0

> Tôi muốn điều khiển trông bình thường. Tôi chỉ muốn chỉ ra rằng đó là một trải nghiệm giao diện người dùng khủng khiếp để có một điều khiển chỉ đọc xuất hiện giống như một điều khiển có thể chỉnh sửa. – FlySwat

+0

Điểm đáng chú ý. Đó là một ứng dụng giả/thử nghiệm để chỉ ra một cái gì đó .. Tôi nghĩ rằng các vị thần UX sẽ cho tôi sống :) – Gishu

+0

Trên suy nghĩ thứ hai tôi nghĩ rằng hình ảnh sẽ là câu trả lời tốt nhất .. biểu mẫu của tôi chỉ cho thấy trạng thái của các van khác nhau trên thực tế cơ sở thời gian. Mỗi tiện ích cần hiển thị một hình ảnh khác nhau dựa trên giá trị trường hậu trường – Gishu

Trả lời

11

Đối với một số winforms điển hình điều khiển:

http://jquiz.wordpress.com/2007/05/29/c-winforms-readonly-controls/

Đây cũng là một mẹo tốt để duy trì sự xuất hiện:

Color clr = textBox1.BackColor; 
    textBox1.ReadOnly = true; 
    textBox1.BackColor = clr; 
+0

Aah .. Chỉ đọc cho các hộp văn bản thuần túy. Radiobuttons cũng dễ dàng. Tôi có một combobox mà sẽ cần một hack xấu xí .. Mặt khác, nếu chỉ đọc của nó .. Tôi cũng có thể biến điều đó thành một nhãn hoặc hộp văn bản. Cảm ơn sẽ chấp nhận điều này trừ khi chúng tôi có một ứng cử viên mới. – Gishu

+0

tôi đồng ý với Jonathan nhưng chỉ cần thêm mẹo đó nếu bạn thực sự cần nó. –

3

Textbox

tài sản .ReadOnly true

Điều khiển không có ReadOnly

Điều khiển khác không có mọi lúc thuộc tính Chỉ đọc. Bạn sẽ cần phải chơi với Sự kiện để gỡ bỏ quá trình chỉnh sửa và giữ giá trị của bạn không thể chỉnh sửa.

1

Hai thuộc tính liên quan Chỉ đọc và được bật. ReadOnly = true ngăn cản việc chỉnh sửa màu xám trên nền, nhưng nó vẫn cho phép lấy nét. Enabled = false grays ra nền, văn bản và ngăn chỉnh sửa hoặc lấy nét.

Quy ước giao diện người dùng Windows cho người dùng một gợi ý trực quan rằng kiểm soát là chỉ đọc (theo cách đó họ sẽ không cố gắng chỉnh sửa và sau đó bị thất vọng). Trạng thái bị tắt màu xám là quy ước hệ thống được xác định, nhưng có thể tranh cãi quá nhiều về một tín hiệu (và không phải là một tín hiệu đủ).

Tuyến đường đơn giản nhất là thiết lập điều khiển của bạn thành ReadOnly, đặt nền thành System.Drawing.SystemColors.Window và sau đó chặn thông báo tiêu điểm. Bạn có thể làm điều này bằng cách bắt các sự kiện OnEnter và ngay lập tức chuyển Focus đến một điều khiển khác không phải chỉ đọc (nói, nút Đóng hoặc Chỉnh sửa). Hoặc bạn có thể lấy được quyền kiểm soát của chính mình và ăn bất kỳ tin nhắn WM_SETFOCUS nào. Ví dụ bên dưới.

Tôi tin rằng các bộ kiểm soát của bên thứ ba khác nhau cung cấp cho bạn các tùy chọn bổ sung và chi tiết.

public class ReadOnlyTextBox : TextBox 
{ 
    const uint WM_SETFOCUS = 0x0007; 

    public ReadOnlyTextBox() 
    { 
     this.ReadOnly = true; 
     this.BackColor = System.Drawing.SystemColors.Window; 
     this.ForeColor = System.Drawing.SystemColors.WindowText; 
    } 

    protected override void WndProc(ref Message m) 
    { 
     // eat all setfocus messages, pass rest to base 
     if (m.Msg != WM_SETFOCUS) 
     base.WndProc(ref m); 
    } 
} 
4

Để thực hiện các hình thức kiểm soát chỉ đọc ngay lập tức trên một cú nhấp chuột làm sử dụng mảnh sau Code:

public void LockControlValues(System.Windows.Forms.Control Container) 
    { 
     try 
     { 
      foreach (Control ctrl in Container.Controls) 
      { 
       if (ctrl.GetType() == typeof(TextBox)) 
        ((TextBox)ctrl).ReadOnly = true; 
       if (ctrl.GetType() == typeof(ComboBox)) 
        ((ComboBox)ctrl).Enabled= false; 
       if (ctrl.GetType() == typeof(CheckBox)) 
        ((CheckBox)ctrl).Enabled = false; 

       if (ctrl.GetType() == typeof(DateTimePicker)) 
        ((DateTimePicker)ctrl).Enabled = false; 

       if (ctrl.Controls.Count > 0) 
        LockControlValues(ctrl); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 
    } 

Sau đó gọi nó từ nút của bạn Click vào tổ chức sự kiện như thế này:

LockControlValues(this) 

Hy vọng, điều này giúp giải quyết vấn đề của bạn:

Lập trình hạnh phúc,

Rajan Arora www.simplyrajan.co.nr

0

Tôi đã đưa ra yêu cầu tương tự này tại nơi làm việc hôm qua. Ngoại trừ thay vì một hộp văn bản tôi đã phải làm cho toàn bộ một hình thức vô hiệu hóa mà không thay đổi màu sắc của nó.

Vì vậy, tôi thay thế một cuộc gọi đến

form->Enabled = false; 

với

IntPtr hWnd = form->Handle; 
HWND window_handle = (HWND)hWnd.ToPointer(); 
::EnableWindow(window_handle, aEnable ? TRUE:FALSE); 

nào làm việc tốt. Bạn có thể thấy ở trên rằng tôi đang sử dụng managed C++. Toàn bộ biểu mẫu hiện đã bị tắt nhưng không chuyển sang màu xám.

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