2008-11-01 3 views
5

Возврат к WinForms в VS2008 после долгого времени .. Трюки с проблемой OOD в VS2008 Express Edition.Как сделать Windows Forms только для чтения?

Мне нужно, чтобы некоторые элементы управления отображались только на дисплее. Пользователь не должен изменять значение этих элементов управления ... виджеты обновляются периодическим событием обновления. Я смутно помню, что есть свойство ReadOnly, которое вы могли бы установить таким образом ... не можете найти его сейчас.

Включено свойство установлено в false: выдает содержимое контрольного содержимого. Я хочу, чтобы контроль выглядел нормально. Заблокировано Свойство установлено в false: похоже, он защищает пользователя от случайного искажения элемента управления в Visual Form Designer.

Что мне не хватает?

+0

> Я хочу, чтобы управление выглядело нормально. Я просто хотел бы отметить, что это ужасный опыт пользовательского интерфейса, который имеет элемент управления только для чтения, который выглядит так же, как редактируемый элемент управления. – FlySwat 2008-11-01 19:08:17

+0

Точка отмечена. Это поддельное/тестовое приложение, чтобы просто демонтировать что-то .. Я думаю, что боссы UX позволят мне жить :) – Gishu 2008-11-01 19:11:15

ответ

3

Textbox

.ReadOnly свойство к истинному

Элементы управления без ReadOnly

Другие элементы управления не имеют свойство ReadOnly. Вам нужно будет играть с событиями, чтобы снять процесс редактирования и не изменять значение.

1

Два соответствующих свойства ReadOnly и Enabled. ReadOnly = true предотвращает редактирование серых фонов, но он все же позволяет фокусироваться. Enabled = false выделяет фон, текст и предотвращает редактирование или фокусировку.

Условные обозначения Windows UI дают пользователю визуальный сигнал о том, что элемент управления доступен только для чтения (таким образом, они не будут пытаться редактировать его и впоследствии разочаровываться). Отключенное состояние с серым цветом - это условное обозначение системы, но это слишком большая часть реплики (а не достаточно длинного).

Простейший маршрут - это probababy, чтобы настроить ваш контроль на ReadOnly, установить фон в System.Drawing.SystemColors.Window, а затем заблокировать сообщения фокуса. Вы можете сделать это, поймав события OnEnter и сразу же перемещая Focus в другой элемент управления, который не является readonly (например, кнопка Close или Edit). Или вы можете получить свой собственный контроль и съесть любые сообщения WM_SETFOCUS. Пример ниже.

Я считаю, что различные сторонние наборы управления предоставляют дополнительные возможности и детализацию.

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

Для того, чтобы формы управления Readonly мгновенно одним нажатием мыши сделать с помощью следующей peice Кодекса:

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()); 
     } 
    } 

Затем вызовите его из Button Click Event, как это:

LockControlValues(this) 

Надеюсь, это поможет решить вашу проблему:

Happy Programming,

Раджан Арора www.simplyrajan.co.nr

0

я получил такое же требование на работе вчера. Кроме того, вместо текстового поля мне пришлось отключить всю форму без изменения ее цвета.

Так я заменил вызов

form->Enabled = false; 

с

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

который работал хорошо. Вы можете видеть выше, что я использую управляемый C++. Вся форма теперь отключена, но не greyed вне.

Смежные вопросы