将一组文本框控件更改为只读 = false



我有一组文本框控件,我想将其从只读中更改出来。我的代码片段如下。只读行给出错误"控件没有只读的定义..."我相信这个问题与 TextBoxBase 类中的只读功能有关。如何解决此问题并访问 TextBoxBase 类?

foreach (Control c in fraPParameters.Controls)
{
if (c is Label)
{
c.Visible = false;
c.Text = string.Empty;
c.Tag = string.Empty;
tt.SetToolTip(c, null);
}
if (c is TextBox)
{
c.Visible = false;
c.ReadOnly = false;
c.Text = string.Empty;
c.Tag = string.Empty;
tt.SetToolTip(c, null);
c.BackColor = Color.White;
}
}

使用类型模式,该模式测试表达式是否可以转换为指定类型,如果可以,则将其转换为该类型的变量。

当使用类型模式执行模式匹配时,是测试 表达式是否可以转换为指定类型,如果 可以,将其强制转换为该类型的变量。这是一个直截了当的 IS 语句的扩展,可实现简洁的类型计算和 转换。是类型模式的一般形式是:

expr is type varname

示例

if (sender is TextBox textBox) 
{
textBox.Visible = false;
textBox.ReadOnly = false;
textBox.Text = string.Empty;
textBox.Tag = string.Empty;
...

此外,您可能只想使用具有模式匹配的 switch 语句,如 Callum Watkins 在评论中提到的那样

foreach (Control c in fraPParameters.Controls)
{
switch (c)
{
case TextBox textbox:
textbox.Visible = false;
textbox.ReadOnly = false;
textbox.Text = string.Empty;
textbox.Tag = string.Empty;
//...
break;
case Label label:
label.Visible = false;
label.Text = string.Empty;
label.Tag = string.Empty;
//...
break;
}
}

其他资源

是(C# 参考)

检查对象是否与给定类型兼容,或者(从 C# 7.0) 针对模式测试表达式。

使用模式匹配开关语句

问题是c变量仍然被类型为Control,即使我们刚刚检查了它指向的对象引用是否真的是一个TextBox。条件检查不会更改引用变量的基础类型,并且基Control类型不支持ReadOnly属性。

有几种方法可以解决这个问题。我们已经有了使用 C# 7 的新is转换的答案。但是,如果您还不能使用它,请尝试此操作(这仍然是很多人):

foreach (Control c in fraPParameters.Controls)
{
var lbl = c as Label;
var box = c as TextBox;
if (lbl != null)
{
lbl.Visible = false;
lbl.Text = string.Empty;
lbl.Tag = string.Empty;
tt.SetToolTip(c, null);
}
if (box != null)
{
box.Visible = false;
box.ReadOnly = false;
box.Text = string.Empty;
box.Tag = string.Empty;
tt.SetToolTip(c, null);
box.BackColor = Color.White;
}
}

最新更新