これは、cc のすべてのコントロールが TextBox であるとは限らないためです。したがって、それらを TextBox に変換しようとすると、変数は null になります。変数が null の場合、その変数のどのプロパティにもアクセスできないか、エラーが発生します。したがって、変数が null になる可能性がある場合はいつでも、最初にそれが null かどうかをテストする必要があります。
問題を解決するために使用する変更された if コマンドを次に示します。
if (tb != null && tb.ReadOnly) { tb.ReadOnly = false; }
したがって、TextBoxes を他のコンテナー コントロールに含めることができることを見落としていたことをお詫びします。はい、つまり、次の 2 つのうちの 1 つを実行する必要があります。 1: TextBox を GroupBox の外に移動できます。ハハ。冗談です。はい、それはその問題を解決できますが、さらに悪い問題があります。Controls
正しい方法は、プロパティにコントロールを持つすべてのコントロールに対してメソッドを再帰的に呼び出すことです。すべてのコントロールにはこのプロパティがありますが、コンテナーではないコントロールでは空 (null ではない) のようです。(今日、すべてのコントロールにこのControls
プロパティがあることを知ったので、これを反映するようにコードを更新しました。)したがって、この実際のソリューションについては、次のようなものを提案します。
private void TextBoxesReadOnlyTrue(Control.ControlCollection cc)
{
foreach (Control ctrl in cc)
{
TextBox tb = ctrl as TextBox;
if (tb != null && tb.ReadOnly)
{ tb.ReadOnly = false; continue; }
if (ctrl.Controls != null && ctrl.Controls.Count > 0)
{ TextBoxesReadOnlyTrue(ctrl.Controls); }
// this recursively calls this same method for every control ...
// that is a container control that contains more controls, ...
// such as GroupBoxes, Panels, etc.
}
}