【问题标题】:Converting a String to Control type将字符串转换为控件类型
【发布时间】:2018-07-23 13:25:57
【问题描述】:

我可以找出当前Form 上是否存在具有某些名称的组件,如下面的代码。

if (!this.Controls.ContainsKey("MyControlName"))
{
      //do anything
}

但是我如何识别它是否是TextBox

我试过了

string viewIdentifier = "MyControlName";
string val = null;

if (viewIdentifier is Textbox)
{
    val = viewidentifier.Text;
}

如何将MyControlName 类型从string 转换为Control

【问题讨论】:

  • 通过索引器:this.Controls["MyControlName"] 还有this.Controls.Find()
  • @Alex 但是如何判断是不是文本框呢?
  • 我将名称存储在字符串变量中,而不是在控件中
  • DownVoting 是正确的,但请给出原因,,,以便新用户更好地理解

标签: c# winforms


【解决方案1】:

类似这样的:

string val = (this.Controls[viewIdentifier] as TextBox)?.Text;

这里

  1. 我们在 Controls 中搜索 Control 的名称 - viewIdentifier
  2. as TextBox:尝试将控件转换为TextBoxnull,如果不是TextBox
  3. ?.Text 如果转换成功,则获取Text(否则为null

编辑如果您想要is(让我们修改您当前的代码),您可以使用模式匹配(C# 7.0)实现例程:

  string viewIdentifier = "MyControlName";
  string val = null;

  // viewIdentifier is String, when this.Controls[viewIdentifier] is Control
  // ... is TextBox textbox: if left side matches TextBox pattern
  // then textbox is a matched pattern to work with 
  if (this.Controls[viewIdentifier] is TextBox textbox) {
    val = textbox.Text;
  }

【讨论】:

  • 不存在作为Textbox存在而Text为null的可能性吗?
  • @Cetin Basoz: no, Text 不能是 null 而是空字符串
  • @JᴀʏMᴇᴇ:尝试将null 分配给Text 并查看:myTextBox.Text = null; if (myTextBox.Text == null {MessageBox.Show("It's null"); else if (myTextBox.Text == "") MessageBox.Show("It's an empty string")})
  • 感谢 JayMee 和 Dmitry 我会试试这个
  • @DmitryBychenko - 不,你是对的,我的意思是这是不正确的。这就像不是你的那样。
【解决方案2】:
string viewIdentifier= "MyControlName";

var hasTextBoxWithThisName = this.Controls.OfType<TextBox>().Any(c => c.Name == viewIdentifier);

编辑:

var t = this.Controls.OfType<TextBox>()
            .SingleOrDefault(c => c.Name == viewIdentifier);
if (t != null)
{
     var text = t.Text;
}

【讨论】:

  • 您只需访问它即可。编辑给你看。你的问题是关于检查它是否存在。
  • thanx Cetin 我会试试这个
  • 我不是反对者,但是,您可能应该把它写成this.Controls.OfType&lt;TextBox&gt;().FirstOrDefault(c =&gt; c.Name == viewIdentifier); - Default 中的错字;我在这里没有看到Single 的任何理由;请放弃误导性(未经编辑)的解决方案
  • @DmitryBychenko,未经编辑的版本不会产生误导。他在问如何检查是否有一个名为“xxx”的控件以及它是否是一个文本框。
猜你喜欢
  • 2015-03-13
  • 2020-05-21
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多