2

在语句controls的帮助下,我正在我的 WinForms 表单中搜索一些内容。foreach我正在比较通过“is”-reference ( a is DataGridView) 找到的对象。“a”是控件集合中的对象。到目前为止效果很好,因为我表单上的比较对象都彼此完全不同。

在我创建的一个新表单中,我使用了一个DataGridView被调用的派生版本my_datagridview。因此,当通过“is”引用my_datagridview将 a 与 a 进行比较时,DataGridView不会引发异常,这是“错误的”,因为我想分别处理这两个。

有没有办法比较my_datagridviewDataGridView正确?

4

6 回答 6

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.

于 2012-07-25T15:51:39.813 回答
2

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

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

请参阅此处的 MDSN

于 2012-07-25T15:51:59.463 回答
1

首先我更喜欢

所以

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

if(mygd != null) {...}
else
{
   if(dg != null) {...}
}
于 2012-07-25T15:55:18.683 回答
1

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

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

这样做会导致InvalidCastException因为向下转换失败!

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

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

如果向下转换失败,它不会抛出异常,而是返回 null!

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

if(m_dgv==null)
{
//its a datagridview
}
else
{
//its a mydatagridview
}
于 2012-07-25T16:13:21.327 回答
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.
}
于 2012-07-25T15:52:30.667 回答
0

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

private void ClickButtonOne(object sender, EventArgs e)
{
// Do something with datagridview here
}
于 2012-07-25T16:25:53.167 回答