4

winform 内のすべての textBoxes の ReadOnly プロパティを true から false に変更するにはどうすればよいですか? このコードを使用しようとしていますが、オブジェクトの null 参照エラーが表示されます...

    private void TextBoxesReadOnlyTrue(Control.ControlCollection cc)
    {
        foreach (Control ctrl in cc)
        {
            TextBox tb = ctrl as TextBox;
            if (tb.ReadOnly)
             {
                tb.ReadOnly = false;
             }

        }
    } 
4

2 に答える 2

6

これは、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.
    }
}
于 2013-10-30T02:26:08.440 に答える