-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());
}

但是,它的设置器要复杂得多。getter 和 setter 不对称。

.Visible 属性可能不仅仅返回您设置它的最后一个值,而是返回控件的当前状态。由于您在调试时更改了其属性,因此您尚未允许控件更新,因此它们当前不可见。

如果您允许代码运行以更新窗口,则状态应变为可见。

您也可以通过在更改 Visible 属性后立即放置 Application.DoEvents() 来测试这一点(但不要将 Application.DoEvents() 用于测试以外的任何事情 - 这太可怕了。)

于 2012-10-04T13:38:36.800 回答
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;
}

我已经用这个小改动重新创建了你的代码,如下所示,它对我有用:

党卫军

于 2012-10-04T13:30:08.140 回答
0

如果一个控件设置为可见,如果它的父控件不可见,它仍然是不可见的。因此,如果它位于您尚未显示的表单上,则在显示表单之前它们不会显示。

于 2012-10-04T13:33:41.270 回答