設定Win Form某個Tab中的物件為ReadOnly

設定Win Form某個Tab中的物件為ReadOnly

前言

在某個Tab我們不想給User修改時,我們會使用Tab.Enabled = false,但是這個會導致控制項中有scroll bar也無法scroll,如datagrid, TextBox等等!

image

研究

因為不能使用Enabled = false,所以我們要改使用ReadOnly=true,所以就將Tab中的Controls全都設定成Readonly = true,但有些沒有Readonly屬性的物件,就設成Enabled = false。

那要如何設定物件的ReadOnly屬性呢? 就使用GetType.GetProperty("ReadOnly")來判斷是否有這個屬性,有的話,就可以直接呼叫它,沒有的話,就呼叫Control的Enabled屬性。Code如下,


  For Each ctl As Control In vCtrl.Controls
    Dim propInfo As System.Reflection.PropertyInfo = ctl.GetType.GetProperty("ReadOnly")
    If IsNothing(propInfo) Then
      '沒有ReadOnly改用Enabled for button, comboBox
      ctl.Enabled = Not vblnIsReadOnly
    Else
      propInfo.SetValue(ctl, vblnIsReadOnly, Nothing)
    End If
    If ctl.Controls.Count > 0 Then
            SetReadOnly(ctl, vblnIsReadOnly)
    End If
  Next
End Sub

結論

原本想在tab的EnabledChanged事件中去改變Control的Readonly屬性及Enabled屬性,但是Control的Enabled屬性是吃他的Parent的Enabled屬性,所以當tab設成了Enabled=false時,設定tab中的Control的Enabled=true後,該Control的Enabled還是為false。

測試範例

SetCtrlReadOnly.rar

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^