4

我正在为我的项目制作一些验证功能,但我遇到了一些问题。我想要一个函数来处理几个不同的控件和错误。
这是我的代码:

private void ValidateControls(Control c)
{
    if (c is TextBox)
    {
        if (c.Text == "")
        {
            epNew.SetError(c, "Something");
        }
    }
    else if (c is ComboBox)
    {
        // What now?
        // if (c.SelectedItem == null) does not work
    }

}

我这样称呼它:

private void txtNEAN_Validating(object sender, CancelEventArgs e)
{
    ValidateControls(txtNEAN);
}

这适用于文本框。但如果我这样做:

private void cbbEMerk_Validating(object sender, CancelEventArgs e)
{
    ValidateControls(cbbEMerk);
}

if (c.SelectedItem == null)例如不起作用。
我怎样才能做到这一点?这可以使用吗?如果没有,有什么更好的选择?
我什么都想听!

4

3 回答 3

6

在这种情况下,您必须转换cComboBox

else if (c is ComboBox)
     {
         if (((ComboBox)c).SelectedItem == null)
     }

顺便说一句,_Validating如果每个控件都做同样的事情,不要为每个控件创建一个方法。您可以使用一个,或一个txtBox_Validating用于文本框,一个comboBox_Validating用于组合框等。

于 2016-09-20T08:51:53.367 回答
2

尝试使用

((ComboBox)c).SelectedItem

反而。这告诉程序将 Control c 解析为 ComboBox。

作为替代方案,is您可以使用而不是使用as

// Converts c to a ComboBox. If c is not a ComboBox, assigns null to cmbControl

ComboBox cmbControl = c as ComboBox; 
if (cmbControl != null)
{
    if (cmbControl.SelectedItem != null)
    {
        // Do stuff here
    }
}
// Else it's not a ComboBox
于 2016-09-20T09:02:07.130 回答
1

了解使用 as 和 is 的安全转换也很好:

因为对象是多态的,所以基类类型的变量可以保存派生类型。要访问派生类型的方法,必须将值转换回派生类型。但是,在这些情况下尝试进行简单转换会产生抛出 InvalidCastException 的风险。这就是 C# 提供 is 和 as 运算符的原因。您可以使用这些运算符来测试强制转换是否会成功而不会引发异常。通常, as 运算符更有效,因为如果可以成功进行转换,它实际上会返回转换值。is 运算符只返回一个布尔值。因此,当您只想确定对象的类型但不必实际转换它时,可以使用它。


你可以在这里 看到更多

于 2016-09-20T09:31:44.823 回答