.Net: Почему мы не можем программно получить доступ к некоторым свойствам элемента управления в winforms? - PullRequest
1 голос
/ 15 мая 2010

.Net: Почему мы не можем программно получить доступ к некоторым свойствам элемента управления в winforms? Например, свойство «Заблокировано» групповой коробки недоступно с помощью кода. Итак, что я могу сделать, если хочу заблокировать это программно? Использование Enabled = False отключит все элементы управления внутри него, и я не хочу этим быть.

Есть предложения?

Ответы [ 5 ]

1 голос
/ 15 мая 2010

Заблокировано - это вообще не свойство, а просто значение, хранящееся в файле ресурсов. Блокировка элемента управления Form приводит к логическому значению ресурса $this.Locked, установленному в значение true.

Кроме того, некоторые свойства прикреплены к элементам управления с использованием IExtenderProvider, аналогично прикрепленным свойствам в WPF. Например, дизайнер добавит свойство ToolTip для всех элементов управления после добавления элемента управления ToolTip в конструктор. Чтобы установить текст всплывающей подсказки по коду, вы должны использовать

this.toolTip1.SetToolTip(this.button1, "A button.");

, поскольку для элементов управления нет свойства ToolTip.

И есть больше механизмов, таких как ICustomTypeDescriptor, которые приводят к отображению в конструкторе свойств, отличных от свойств, которые действительно определены для элемента управления.

Существует универсальное решение для отключения элементов управления WinForms без их отключения, но, к сожалению, я не могу ни вспомнить, ни найти его ...

1 голос
/ 15 мая 2010

Если вы хотите отключить свои элементы управления, не отключая их, точная процедура для этого может быть довольно сложной и зависит от типа элемента управления. Я даю вам несколько указателей ниже для TextBox, для CheckBox & RadioButton и для ComboBox элементов управления.

Имейте в виду, что эта возможность не встроена в Winforms по определенной причине: элемент управления, который выглядит включенным, но на самом деле отключен (только для чтения), возможно, запутает многих пользователей вашего приложения, поскольку работа с вашими элементами управления не будет соответствовать их ожиданиям относительно того, как обычно работают элементы управления Windows.

TextBox

Установите для свойства TextBox.ReadOnly значение true.
(см., Например, статью Создание текстового поля только для чтения в MSDN .)

CheckBoxRadioButton)

Установите для свойства CheckBox.AutoCheck значение false.
Обратите внимание, что это также работает для RadioButton элементов управления.


Редактировать : К сожалению, я не могу получить свои источники для создания ComboBox только для чтения прямо сейчас. Однако это довольно сложно и включает перехват оконных сообщений в WndProc. Возможно, вместо этого посмотрите эту статью о CodeProject .

1 голос
/ 15 мая 2010

Знаете ли вы, что на самом деле означает «Заперто»? Это не обычное свойство и никак не влияет на время выполнения, только на дизайнера. Вам, вероятно, следует перейти к проблеме, которую вы пытаетесь решить. Уверяю вас: свойство «Заблокировано» для этого не нужно.

0 голосов
/ 15 мая 2010

Как уже отмечали другие, на самом деле вы хотите сделать элементы управления доступными только для чтения, но кроме текстовых полей и радиокнопок это может быть довольно сложно.

Ниже приведен отрывок из некоторого кода, который я написал для обработки чего-то подобного, но клиент хотел дешевый, а не совершенный, поэтому у меня была некоторая гибкость, поэтому она может не сработать для вас. Метод просто вызывается SetControlsReadonly(gb.Controls) (при условии, что групповой блок называется gb).

Private Sub SetControlsReadonly(ByVal ctrls As Windows.Forms.Control.ControlCollection)
  For Each ctrl As Control In ctrls
     ctrl.Enabled = True ' first enable everything so that it'll all look the same
     If TypeOf ctrl Is TextBox Then
        CType(ctrl, TextBox).ReadOnly = True
     ElseIf TypeOf ctrl Is Button Then
        CType(ctrl, Button).Enabled = False
     ElseIf TypeOf ctrl Is CheckBox Then
        CType(ctrl, CheckBox).AutoCheck = False
     ElseIf TypeOf ctrl Is ComboBox Then
        ctrl.Enabled = False 
        if ctrl.Tag IsNot Nothing Then
            ' call method that hides the combo and instead shows a readonly textbox in the same location containing the same data
        End If
     ElseIf TypeOf ctrl Is DateTimePicker Then
        ctrl.Enabled = False
     End If
     SetControlsReadonly(ctrl.Controls)
  Next
End Sub
0 голосов
/ 15 мая 2010

Вы можете отключить его !!!!

daveTextBox.Enabled = False

Это, очевидно, изменит внешний вид элемента управления. Если вы не хотите изменять внешний вид элемента управления, переопределите обработчик события нажатия клавиши, чтобы ничего не делать.

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