0

次の抽象クラスから継承するいくつかのユーザーコントロールがあります。

Public MustInherit Class CustomVRAUserControl
    Inherits System.Web.UI.UserControl

    Public MustOverride Sub ClearErrors()
    Public MustOverride Sub UpdateLabels()
    Public MustOverride Function Validate() As Boolean
    Public MustOverride Sub UpdateSession()

End Class

ユーザーコントロールを使用するウィザードがあります。特定の条件に対して、いくつかの動的な作業の削除手順があります。ウィザードのサンプルは次のとおりです。

<asp:Wizard ID="VRAWizard" runat="server"......>    
        <WizardSteps>
            <asp:WizardStep ID="wizResidentialAddress" runat="server" 
                Title="RESIDENTIAL ADDRESS" StepType="Step">
                  <uc2:ResidentialAddress ID="uctlResidentialAddress" runat="server" />                       
            </asp:WizardStep>

            <asp:WizardStep ID="wizMailingAddress" runat="server" 
                Title="MAILING ADDRESS"  StepType="Step">
                  <uc3:MailingAddress ID="uctlMailingAddress" runat="server" /> 
            </asp:WizardStep>
        </WizardSteps>
    </asp:Wizard>

ウィザードクラスの背後にあるコードでは、NextButtonのクリックにいくつかの作業があります。

Protected Sub VRAWizard_NextButtonClick(sender As Object, e As System.Web.UI.WebControls.WizardNavigationEventArgs) Handles VRAWizard.NextButtonClick

        If VRAWizard.ActiveStep.ID = "wizResidentialAddress" Then
            uctlResidentialAddress.ClearErrors()
            If Not (uctlResidentialAddress.validate) Then
                uctlResidentialAddress.UpdateLabels()
                e.Cancel = True
            Else
                uctlResidentialAddress.UpdateSession()
            End If
        End If


        If VRAWizard.ActiveStep.ID = "wizMailingAddress" Then
            uctlMailingAddress.ClearErrors()
            If Not (uctlMailingAddress.validate) Then
                uctlMailingAddress.updateLabels()
                e.Cancel = True
            Else
                uctlMailingAddress.UpdateSession()
            End If
        End If

明らかに、それはかなり繰り返しです。

…のようなことをしたいのですが。

CType(VRAWizard.ActiveStep.Controls.Item(0), CustomVRAUserControl).ClearErrors()

    If Not (CType(VRAWizard.ActiveStep.Controls.Item(0), CustomVRAUserControl).Validate()) Then
        CType(VRAWizard.ActiveStep.Controls.Item(0), CustomVRAUserControl).UpdateLabels()
        e.Cancel = True
    Else
        CType(VRAWizard.ActiveStep.Controls.Item(0), CustomVRAUserControl).UpdateSession()
    End If

ただし、もちろん、コンパイラーはキャストを作成できないため、これを行うとランタイムエラーが発生します。

何か案は?

4

1 に答える 1

1

キャストを処理できるはずです。コレクションの最初のコントロールはリテラルだと思うので、これを行う必要があります。

CType(VRAWizard.ActiveStep.Controls.Item(1), CustomVRAUserControl).ClearErrors() 

再度使用するので、変数に設定することをお勧めします。

Dim objVRAControl As CustomVRAUserControl = CType(VRAWizard.ActiveStep.Controls.Item(1), CustomVRAUserControl) 

次に、次のことができます。

objVRAControl.ClearErrors()

それでも問題が解決しない場合は、BreakPointとWatch変数を使用して、正しいインデックスを使用していることを確認してください。

于 2012-05-11T21:31:52.267 に答える