-3

私は次のコードブロックを持っています:

        Label[] TagLabels = { labelCITag, labelCATag, labelCAuthTag, labelCLTag, labelCCTag, labelOther1Tag, labelOther2Tag, labelOther3Tag, labelOther4Tag };
        TextBox[] TagTextBoxes = { textBoxCITag, textBoxCATag, textBoxCAuthTag, textBoxCLTag, textBoxCCTag, textBoxOther1Tag, textBoxOther2Tag, textBoxOther3Tag, textBoxOther4Tag };
        for (int i = 0; i < TagTextBoxes.Length; i++)
        {
            if (TagTextBoxes[i].Text == "")
                TagLabels[i].Visible = false;
            else
                TagLabels[i].Visible = true;
        }

このコードは TextBoxes を反復処理し、TextBoxes が空かどうかに基づいてラベルを表示/非表示にします。

デバッグ ウィンドウで、コードが else 条件を実行することを確認できますが、マウスをプロパティの上に移動すると、まだ false として表示され、即時ウィンドウで確認されます。

なぜこのクレイジーなことが起こっているのか誰か教えてもらえますか?

ここに画像の説明を入力

ここに画像の説明を入力

ここに画像の説明を入力

4

3 に答える 3

4

Reflector を使用して Control.Visible の実装を確認する場合、その getter は次のことを行います。

internal virtual bool GetVisibleCore()
{
    if (!this.GetState(0x2))
    {
        return false;
    }
    return ((this.ParentInternal == null) || this.ParentInternal.GetVisibleCore());
}

ただし、セッターははるかに複雑です。ゲッターとセッターは対称的ではありません。

.Visible プロパティは、最後に設定した値を返すだけでなく、コントロールの現在の状態を返す可能性があります。デバッグ中にプロパティを変更したため、コントロールの更新をまだ許可していないため、現在表示されていません。

ウィンドウが更新されるようにコードの実行を許可すると、状態は Visible になります。

また、Visible プロパティを変更した直後に Application.DoEvents() を配置して、これをテストすることもできます (ただし、テスト以外の目的で Application.DoEvents() を使用しないでください。これは恐ろしいことです。)

于 2012-10-04T13:38:36.800 に答える
0

コントロールが表示に設定されている場合、その親が表示されていない場合、コントロールは非表示のままです。したがって、まだ表示していないフォーム上にある場合は、フォームが表示されるまで表示されません。

于 2012-10-04T13:33:41.270 に答える
0

これを試して:

Label[] TagLabels = { labelCITag, labelCATag, labelCAuthTag, labelCLTag, labelCCTag, labelOther1Tag, labelOther2Tag, labelOther3Tag, labelOther4Tag };
TextBox[] TagTextBoxes = { textBoxCITag, textBoxCATag, textBoxCAuthTag, textBoxCLTag, textBoxCCTag, textBoxOther1Tag, textBoxOther2Tag, textBoxOther3Tag, textBoxOther4Tag };
for (int i = 0; i < TagTextBoxes.Length; i++)
{
    if (string.IsNullOrEmpty(TagTextBoxes[i].Text))
        TagLabels[i].Visible = false;
    else
        TagLabels[i].Visible = true;
}

以下に示すように、この小さな変更を加えてコードを再作成しましたが、うまくいきます。

SS

于 2012-10-04T13:30:08.140 に答える