2

ステートメントcontrolsの助けを借りて、WinForms フォーム内のいくつかを検索しています。foreach「is」参照 ( a is DataGridView) で見つけたオブジェクトを比較しています。「a」はコントロール コレクション内のオブジェクトです。私のフォームで比較されたオブジェクトはすべて互いに十分に異なっているため、これは今のところ問題なく機能しています。

私が作成した新しいフォームでは、DataGridView呼び出されたの派生バージョンを使用していmy_datagridviewます。したがって、「is」参照を介して a を amy_datagridviewと比較すると、DataGridView例外はスローされません。これは「間違った」原因であり、2 つを別々に処理したいと考えています。

正しく比較する方法はありmy_datagridviewますDataGridViewか?

4

6 に答える 6

6

my_datagridview と DataGridView を適切に比較する方法はありますか?

1 つのオプションは、次のようなものを使用することです。

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

アップキャストは常に成功し、ダウンキャストは常に失敗します!

したがって、 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 に答える
1

最初に私は好きです

それで

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

if(mygd != null) {...}
else
{
   if(dg != null) {...}
}
于 2012-07-25T15:55:18.683 に答える
0

上記のコメントに基づいて、コントロールを見つける必要はないと思います。たとえば、フォームにボタンがあり、クリックによって grid1 に何かが発生する場合、ボタンのクリック イベント ハンドラーでこれを使用できます。

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

より派生したバージョンを最初に比較し、そのアクションを実行してから、派生度の低いタイプを比較します (アクションは相互に排他的であると仮定します)。

または、2 つの比較を 1 つの条件文に入れます。

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 に答える