无法将Type1的对象强制转换为Type2?

时间:2016-05-23 07:41:28

标签: c# winforms windows-forms-designer

我正在尝试在基于表单的应用程序中验证GroupBox内的一组控件。

我似乎无法将ComboBox映射到应用程序,以便识别并生成错误,而且只对TextBox执行此操作。

private void groupBox1_Validating(object sender, CancelEventArgs e)
{
    foreach (Control control in groupBox1.Controls)
    {
        string controlType = control.GetType().ToString();
        var lst = new List<string>() { "System.Windows.Forms.TextBox" ,"System.Windows.Forms.ComboBox"};

        //if (controlType == "System.Windows.Forms.TextBox")
        if (lst.Contains(controlType, StringComparer.OrdinalIgnoreCase))
        {
            TextBox txtBox = (TextBox)control;
            ComboBox combo = (ComboBox)control;
            if (string.IsNullOrEmpty(txtBox.Text) && string.IsNullOrEmpty(combo.Text))
            {
                MessageBox.Show(txtBox.Name + " Can not be empty");
            }
        }
    }
}

以下是我收到的错误:

  

无法转换类型为#System; Windows.Forms.ComboBox&#39;的对象。键入&#39; System.Windows.Forms.TextBox&#39;。

5 个答案:

答案 0 :(得分:3)

让我们总结一下你想做的事情:

  1. 对于groupBox1
  2. 中的每个控件
  3. ...类型为TextBox或ComboBox
  4. 验证控件是否为空,如果是,则显示消息框
  5. 以下是一些要点:

    1. Control继承的每个控件都有一个公共Text属性,您不需要知道它是文本框还是该部分的组合框
    2. 无法控制 文本框和组合框(也就是说,没有控件类继承TextBoxComboBox),因此其中一个强制转换将失败时间
    3. 你可以使用as而不是硬强制转换,这会在无法完成的演员阵容中返回null,但是使用第1点。上面这不是必需的
    4. 以下是具有上述知识的重写代码:

      private void groupBox1_Validating(object sender, CancelEventArgs e)
      {
          foreach (Control control in groupBox1.Controls)
          {
              if (!(control is TextBox || control is ComboBox))
                  continue;
              if (!string.IsNullOrEmpty(control.Text))
                  continue;
              MessageBox.Show(control.Name + " Can not be empty");
          }
      }
      

      请注意,如果你想做其他事情, 需要知道控件是文本框还是组合框,我会改写如下:

      private void groupBox1_Validating(object sender, CancelEventArgs e)
      {
          foreach (Control control in groupBox1.Controls)
          {
              var textbox = control as TextBox;
              if (textbox != null)
              {
                  ... do your processing of textboxes here
                  continue;
              }
              var combobox = control as ComboBox;
              if (combobox != null)
              {
                  ... do your processing of comboboxes here
                  continue;
              }
              ... do your processing of other controls here
          }
      }
      

答案 1 :(得分:3)

在您的代码中,它会将任何文本框和任何组合转换为文本框和组合。

你需要把它投射到它只是。

Figure

如果组合框只有文本框和组合框,您也可以这样做:

private void groupBox1_Validating(object sender, CancelEventArgs e)
{
    foreach (Control control in groupBox1.Controls)
    {
        if (control is ComboBox)
        {
            ComboBox combo = (ComboBox)control;
            if (string.IsNullOrEmpty(combo.Text)) MessageBox.Show(combo.Name + " Can not be empty");
        }
        else if (control is TextBox)
        {
            TextBox txtBox = (TextBox)control;
            if (string.IsNullOrEmpty(txtBox.Text)) MessageBox.Show(txtBox.Name + " Can not be empty");
        }
    }
}

答案 2 :(得分:2)

使用is运算符检查您的类型是否正确:

if(control is TextBox)
{
  TextBox txtBox = (TextBox)control;

  // Do something with txtBox
  if (string.IsNullOrEmpty(txtBox.Text))
  {
      MessageBox.Show(txtBox.Name + " Can not be empty");
  }
}

if(control is ComboBox)
{
  ComboBox combo = (ComboBox)control;

  // Do something with combo
  if (string.IsNullOrEmpty(combo.Text))
  {
      MessageBox.Show(combo.Name + " Can not be empty");
  }
}

答案 3 :(得分:2)

由于您只想检查TextName属性,因为TextBoxComboBox都来自Control课程,因此您不会这里需要铸造。这应该适合你:

foreach (Control control in groupBox1.Controls)
{
    if (!lst.Contains(control.GetType().ToString(), StringComparer.OrdinalIgnoreCase)) continue;
    if (string.IsNullOrEmpty(control.Text) && string.IsNullOrEmpty(control.Text))
    {
        MessageBox.Show(control.Name + " Can not be empty");
    }
}

或者与Linq:

foreach (Control control in from Control control in groupBox1.Controls 
                                    where lst.Contains(control.GetType().ToString(), StringComparer.OrdinalIgnoreCase)
                                    where string.IsNullOrEmpty(control.Text) && string.IsNullOrEmpty(control.Text) 
                                    select control)
{
    MessageBox.Show(control.Name + " Can not be empty");
}

答案 4 :(得分:1)

正如@ LasseV.Karlsen指出的那样,我通过单独添加每个控件来走很长的路。我只是添加控件而不是特定控件。

以下是我的更新代码:

foreach (Control control in groupBox1.Controls)
        {
            string controlType = control.GetType().ToString();
            var lst = new List<string>() { "System.Windows.Forms.TextBox" ,"System.Windows.Forms.ComboBox"};

            //if (controlType == "System.Windows.Forms.TextBox")
            if (lst.Contains(controlType, StringComparer.OrdinalIgnoreCase))
            {
               // TextBox txtBox = (TextBox)control;
               // ComboBox combo = (ComboBox)control;
                if (string.IsNullOrEmpty(control.Text) && string.IsNullOrEmpty(control.Text))
                {
                    MessageBox.Show(control.Name + " Can not be empty");
                }
            }