【发布时间】:2015-11-25 16:37:13
【问题描述】:
我遇到了一个问题,没有正确的搜索关键字,我找不到任何有用的东西。
在我的表单控件属性中,有:TextBoxes、Buttons、CheckBoxes 和 ListBox。它们位于面板 (default_panel) 上。还有一个名为:link_panel 的面板。我认为值得记住。
所以,当我单击菜单按钮时,会运行 Show***(),首先隐藏所有控件。
Form1 hd = (Form1)Application.OpenForms["form1"];
foreach (Control c in hd.Controls)
{
c.Visible = false;
}
然后这个 Show***() 开始启用(使可见)所需的控件。
hd.box1.Visible = true;
hd.box2.Visible = true;
hd.label1.Visible = true;
hd.label1.Text = "Sample Text";
当我只需要另一个 Show***() 中的 box1 时,问题就来了。 box2 不会变得不可见。如果我尝试这样做:
TextBox tb = c as TextBox;
tb.Visible = false;
这带有 NullReferenceExecption(我知道这是什么意思)。但是当我做简单的第一个代码运行时没有任何问题(只有这个小错误)。
面板中有很多控件需要单独处理。
所以为了更准确:
面板上有两个标签“启用”。
public void ShowCharacterTable()
{
Form1 hd = (Form1)Application.OpenForms["form1"];
foreach (Control c in hd.Controls)
{
c.Visible = false;
}
hd.label1.Visible = true;
hd.label2.Visible = true;
所以这里有一个示例方法。
应该只有一个,但两个都是可见的。
public void ShowRelationTable()
{
Form1 hd = (Form1)Application.OpenForms["form1"];
foreach (Control c in hd.Controls)
{
if (c is TextBox)
{
c.Visible = false;
}
}
hd.label1.Visible = true;
}
Ps.:如果我没记错的话,在我添加面板之前它就已经磨损了。
【问题讨论】:
-
您的代码有语法错误(例如
Form1 hd = (Form1)Application.OpenForms["form1];)。请编辑您的问题以解决它们。 -
你为什么还要选角?
Visible定义在Control中,无需转换为TextBox。如果您要查看c是否为TextBox,则只需在尝试为Visible赋值之前检查:if (c is TextBox) { c.Visible = false; }。如果c是null,那么它显然不是TextBox,你应该继续迭代(我猜c来自foreach......这里有很多猜测,你的问题缺少很多信息) -
c显然不是TextBox因此它是空的... -
如果你只想要
TextBoxes,那么你可以使用hd.Controls.OfType<TextBox>,你不应该得到NullReferenceException。 -
我不明白,伙计们。我尝试了 InBetween 的 if 语句,它没有打开文本框。我编辑了我的问题以更准确。