“是”-reference或gettype()

时间:2012-07-25 15:47:33

标签: c# .net winforms comparison

我在controls语句的帮助下,在WinForms表单中的foreach内搜索。 我正在通过“is”-reference(a is DataGridView)比较我找到的对象。 “a”是控制集合中的对象。 到目前为止工作正常,因为我的表单上的比较对象都是完全不同的。

在我创建的新表单中,我使用名为DataGridView的{​​{1}}的派生版本。因此,当my_datagridview通过“is” - 引用与my_datagridview进行比较时,不会抛出任何异常,这是“错误的”,因为我想单独处理这两个。

有没有办法比较DataGridViewmy_datagridview

6 个答案:

答案 0 :(得分:6)

  

有没有办法正确比较my_datagridview和DataGridView?

一种选择是使用类似的东西:

if (a is MyDataGridView) // Type name changed to protect reader sanity
{
}
else if (a is DataGridView)
{
    // This will include any subclass of DataGridView *other than*
    // MyDataGridView
} 

或者你可以使用GetType()来完全匹配,当然。重要的问题是,您希望在DataGridViewMyDataGridView派生的任何其他类中发生什么。

答案 1 :(得分:2)

是。首先从最具体的课程开始。所以:

if (a is my_datagridview)
{
    //....
}
else if (a is DataGridView)
{
    // ....
}

See MDSN here

答案 2 :(得分:1)

首先我喜欢更好

所以

var dg = a as DataGrindView
var mygd = a as MyDataGridView

if(mygd != null) {...}
else
{
   if(dg != null) {...}
}

答案 3 :(得分:1)

Upcast总是成功,而downcast总是失败!

因此,当您将my_datagridview向上转换为DataGridView时,它总会成功!

执行此操作会导致 InvalidCastException ,因为向下转发失败!

DataGridView dgv = new DataGridView();
myDataGrivView m_dgv = (myDataGridView)dgv;

为避免抛出上述异常,您可以使用 as 运算符!

如果downcast失败,它将返回null,而不是抛出异常!

DataGridView dgv = new DataGridView();
myDataGrivView m_dgv =dgv as myDataGridView;

if(m_dgv==null)
{
//its a datagridview
}
else
{
//its a mydatagridview
}

答案 4 :(得分:0)

首先比较更多派生版本并执行其操作,然后比较派生较少的类型(假设操作是互斥的)

或者,将两个比较放在一个条件语句中:

if ((a is my_datagridview) && (!a is DataGridView))
{
  // This will only match your derived version and not the Framework version
}
// The else is needed if you need to do something else for the framework version.
else if (a is DataGridView)
{
  // This will only match the framework DataGridView because you've already handled
  // your derived version.
}

答案 5 :(得分:0)

根据我们上面的评论,我认为没有必要找到控件。例如,如果表单上有一个按钮,并且通过单击grid1会发生某些事情,您可以在按钮的单击事件处理程序中使用它:

private void ClickButtonOne(object sender, EventArgs e)
{
// Do something with datagridview here
}