我有一组要从ReadOnly中更改的文本框控件。我的代码段如下。 ReadOnly行给出错误“控件没有ReadOnly的定义...”,我认为问题与TextBoxBase类中的ReadOnly功能有关。如何解决这个问题并可以访问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;
}
}
答案 0 :(得分:3)
使用Type Pattern测试表达式是否可以转换为指定的类型,如果可以,将其强制转换为该类型的变量。
使用类型模式执行模式匹配时,是否进行测试 表达式是否可以转换为指定的类型,如果可以 可以,将其强制转换为该类型的变量。这很简单 is语句的扩展,使简洁的类型评估和 转换。类型模式的一般形式为:
expr is type varname
示例
if (sender is TextBox textBox)
{
textBox.Visible = false;
textBox.ReadOnly = false;
textBox.Text = string.Empty;
textBox.Tag = string.Empty;
...
另外,您可能只想使用Callum Watkins在评论中提到的带有模式匹配的switch语句
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#7.0)针对模式测试表达式。
答案 1 :(得分:2)
问题是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;
}
}