2016-09-20 8 views
4

私のプロジェクトにいくつかの検証関数を作成していますが、何かに取り残されています。 私はいくつかの異なるコントロールとエラーを処理する単一の関数を持っています。
は、ここに私のコードです:コントロールでc.SelectedItemを取得するC#

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)は動作しません。
どうすればいいですか?これは大丈夫ですか?そうでない場合、より良い選択肢は何ですか?
私は何かを聞いてみたい!彼らは同じことを行う場合は、ちなみに、この場合のComboBox

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

cをキャストする必要があり

答えて

6

は、すべてのコントロールのための_Validating方法を作成しないでください。代わりに

((ComboBox)c).SelectedItem 

使用してみてくださいなどのTextBoxのための単一の1、または1 txtBox_Validating、コンボボックスに1つcomboBox_Validating

+0

感謝を見ることができます!できるだけ早くそれに印をつけます。 – Sj03rs

+1

また、https://msdn.microsoft.com/en-us/library/ms950965.aspx(WinFormsで作業しているのかどうかわからないが、とにかく) –

+0

も読んでみてください。また、そのようにキャストする必要はありません'if(((ComboBox)c).SelectedItem == null)'?そうしないと、ComboBoxをメソッドとして使用できないというエラーが表示されます。 – Sj03rs

2

を使用することができます。これは、コントロールcをコンボボックスに解析するようにプログラムに指示します。代替案として

、代わりに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 
1

を使用することができます。

オブジェクトが多型であるため、それがあります派生型を保持するための基本クラス型の変数が可能です。派生型のメソッドにアクセスするには、値を派生型にキャストする必要があります。しかし、これらの場合に単純なキャストを試みると、InvalidCastExceptionがスローされる危険があります。そのため、C#はisとas演算子を提供します。これらの演算子を使用して、例外がスローされることなくキャストが成功するかどうかをテストできます。一般的に、as演算子は、キャストが正常に行われた場合に実際にキャスト値を返すので、より効率的です。 is演算子はブール値のみを返します。したがって、オブジェクトの型を決定したいだけで実際にキャストする必要がない場合に使用できます。


あなたは提案とその答えのためのより多くのhere

関連する問題