我正在尝试在基于表单的应用程序中验证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;。
答案 0 :(得分:3)
让我们总结一下你想做的事情:
groupBox1
以下是一些要点:
Control
继承的每个控件都有一个公共Text
属性,您不需要知道它是文本框还是该部分的组合框TextBox
和ComboBox
),因此其中一个强制转换将失败时间as
而不是硬强制转换,这会在无法完成的演员阵容中返回null
,但是使用第1点。上面这不是必需的以下是具有上述知识的重写代码:
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)
由于您只想检查Text
和Name
属性,因为TextBox
和ComboBox
都来自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");
}
}