Tengo varios controles de usuario que heredan de la siguiente clase abstracta:

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

Tengo un asistente que usa los controles de usuario. Hay algunos pasos de eliminación de trabajo dinámico para determinadas condiciones. Aquí hay una muestra del asistente:

<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>

En el código detrás de mi clase de asistente, tengo algo de trabajo en el clic de 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

Obviamente, eso es bastante repetitivo.

Me gustaría hacer algo como ...

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

Pero, por supuesto, hacer eso genera un error de tiempo de ejecución porque el compilador no puede realizar la conversión.

¿Alguna idea?

0
user158017 11 may. 2012 a las 21:46

1 respuesta

La mejor respuesta

Debería poder soportar el yeso. Creo que el primer control de la colección es literal, así que tendrás que hacer esto:

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

Ya que lo está usando de nuevo, también podría configurarlo en una variable:

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

Entonces puedes hacer:

objVRAControl.ClearErrors()

Si eso no funciona, use un BreakPoint y una variable Watch para asegurarse de que está usando el índice correcto.

1
NoAlias 12 may. 2012 a las 01:31
¡gracias! Cambiar para usar el segundo control funcionó perfectamente.
 – 
user158017
12 may. 2012 a las 01:39