2016-07-17 11 views
0

私はSuperValidatorタイプのすべてのフォームでSuperValidator1という名前のコントロールを持っています。私はこのコントロールを見つけて、名前がすべての形式で一貫しているので名前を使用して有効にしたい。そう、これは私が思いついたコードです:キャストを使用して変換コントロールを変換しない

 Dim validator As SuperValidator 
     Dim frm As Form = Me.ParentForm 
     Dim ctrl As Control() 
     ctrl = frm.Controls.Find("SuperValidator1", True) 
     Dim singleCtrl As Control = ctrl(0) 
     validator = TryCast(singleCtrl, SuperValidator) '< ERROR LINE 

それは、エディタのエラーがスローされます:Value of Type 'Control' cannot be converted to 'SuperValidator'

私はCTypeDirectCastを試みたが、それは同じです。 thisによると、私は任意のデータ型をキャストできる必要があります。何が間違っていて、私は何をすべきですか?ところで

SuperValidatorはここで感謝

+3

。 – dbasnett

+1

あなたはコントロールとしてsingleCtrlを定義していますが、それをバリデータとしてキャストしようとしていますが、それは起こりません。あなたは、データ型を変更する必要があります....あなたは実際にあなたが正しいコントロールを取得していることを確認するために、TypeOfチェックを行うことですべてを検証できます。 – Codexer

+1

'SuperValidator'は[本当にコンポーネントです**](http://www.devcomponents.com/kb2/?p=475)。 –

答えて

1

SuperValidator is a component以降、フォームのコンポーネントコレクションから取得する必要があります。 しかし、実行時のコンポーネントは名前を継承していないようですので、正確なものを見つけるのは難しいかもしれません。

は、私の知る限りでは、あなたの唯一のオプションは次のとおりです。

A)最初にあなたが見つけることができるSuperValidator、または

B)マッチそのプロパティを(可能な場合)を取得します。

あなたがそれを行ういずれかの方法で、あなたはMe.components.Componentsコレクションを反復処理する必要があります。私の推測では、SuperValidatorがコントロールではないということでしょうコントロールを継承しませんが、コンポーネント

Dim validator As SuperValidator = Nothing 

For Each component In Me.components.Components 
    If component.GetType() Is GetType(SuperValidator) Then 
     validator = DirectCast(component, SuperValidator) 
     'Perform additional property checking here if you go with Option B. 
    End If 
Next 
1

は、私は、フォーム上で持っているコントロールを使用してテストされDevComponents.DotNetBar.Validator

からです。あなたのロジックを少し変更しました。試してみて、あなたが持っている結果を見てください。

Dim validator As RichTextBox ' SuperValidator 
    Dim frm As Form = Me ' .ParentForm 
    Dim ctrl() As Control = frm.Controls.Find("RichTextBox1", True) ' ("SuperValidator1", True) 
    If ctrl.Length > 0 Then 
     validator = TryCast(ctrl(0), RichTextBox) ' , SuperValidator) < ERROR LINE 
    Else 
     Stop 
    End If 
関連する問題