.Net:WinFormsでプログラムによってコントロールの一部のプロパティにアクセスできないのはなぜですか?たとえば、グループボックスの「Locked」プロパティには、コードを介してアクセスすることはできません。では、プログラムでロックしたい場合、どうすればよいでしょうか。Enabled = Falseを使用すると、その中のすべてのコントロールがグレー表示されますが、これは私が望んでいることではありません。
助言がありますか ?
.Net:WinFormsでプログラムによってコントロールの一部のプロパティにアクセスできないのはなぜですか?たとえば、グループボックスの「Locked」プロパティには、コードを介してアクセスすることはできません。では、プログラムでロックしたい場合、どうすればよいでしょうか。Enabled = Falseを使用すると、その中のすべてのコントロールがグレー表示されますが、これは私が望んでいることではありません。
助言がありますか ?
Locked の本当の意味を知っていますか? これは通常のプロパティではなく、とにかくランタイムには影響しません。デザイナーのみです。おそらく、解決しようとしている問題に移動する必要があります。私はあなたを保証することができます: 「ロックされた」プロパティはそのために必要ありません.
Locked はプロパティではありません。リソース ファイルに格納されている値にすぎません。コントロールをロックするForm
と、ブール値のリソース値$this.Locked
が true に設定されます。
IExtenderProvider
さらに、一部のプロパティは、WPF の添付プロパティと同様のものを使用してコントロールに添付されます。たとえば、デザイナーにToolTip
コントロールを追加した後、デザイナーはすべてのコントロールのプロパティを表示しますToolTip
。コードでツールヒントのテキストを設定するには、使用する必要があります
this.toolTip1.SetToolTip(this.button1, "A button.");
ToolTip
コントロールのプロパティがないためです。
ICustomTypeDescriptor
また、コントロールに対して実際に定義されているプロパティよりも、さまざまなプロパティがデザイナーに表示されるようなメカニズムが多数あります。
WinFormsコントロールをグレー表示せずに無効にする一般的な解決策がありますが、残念ながら私はそれを思い出したり見つけたりすることができません...
他の人がすでに指摘しているように、実際にやりたいのはコントロールを読み取り専用にすることですが、テキストボックスとラジオボタンを除いて、これはかなり複雑になる可能性があります。
以下は、このようなものを処理するために私が書いたいくつかのコードからの抜粋ですが、クライアントは完璧ではなく安価を望んでいたので、柔軟性があり、うまくいかない可能性があります。メソッドは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
あなたはそれを無効にすることができます!!!!
daveTextBox.Enabled = False
これにより、コントロールの外観が明らかに変わります。コントロールの外観を変更したくない場合は、キー プレス イベント ハンドラーをオーバーライドして何もしないようにします。