Как сделать элемент управления Windows Forms доступным только для чтения? - PullRequest
5 голосов
/ 01 ноября 2008

Возвращение к WinForms в VS2008 после долгого времени. Возиться с проблемой OOD в VS2008 Express Edition.

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

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

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

Ответы [ 5 ]

11 голосов
/ 01 ноября 2008

Для некоторых типичных элементов управления winforms:

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

Это также хороший совет для сохранения внешнего вида:

    Color clr = textBox1.BackColor;
    textBox1.ReadOnly = true;
    textBox1.BackColor = clr;
4 голосов
/ 05 октября 2010

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

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

Затем вызовите его из события «Нажатие кнопки» следующим образом:

LockControlValues(this)

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

Счастливое программирование,

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

3 голосов
/ 01 ноября 2008

Textbox

.ReadOnly свойство true

Управление без ReadOnly

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

1 голос
/ 01 ноября 2008

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

Соглашения о пользовательском интерфейсе Windows предписывают пользователю визуально подсказывать, что элемент управления доступен только для чтения (таким образом, он не будет пытаться редактировать его и впоследствии будет разочарован). Неактивен выключенное состояние заданной условность системы, но это спорно слишком много кии (и не legibile достаточно одного).

Самый простой способ - это, вероятно, установить для элемента управления значение ReadOnly, установить фон для System.Drawing.SystemColors.Window, а затем заблокировать сообщения фокуса. Вы можете сделать это, перехватывая события OnEnter и немедленно перемещая Focus на другой элемент управления, который не доступен только для чтения (например, кнопка «Закрыть» или «Редактировать»). Или вы можете получить свой собственный контроль и есть любые сообщения 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);
   }
}
0 голосов
/ 19 сентября 2013

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

Поэтому я заменил вызов на

form->Enabled = false;

с

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...