2010-12-18 31 views
7

Tengo una casilla de verificación y un panel dentro de un control FormView, y necesito acceder a ellos desde el código subyacente para usar la casilla de verificación para determinar si el panel está o no visible. Este es el código que utilicé originalmente, pero desde que coloqué los controles dentro de FormView, ya no funciona.ASP.NET, VB: ¿cómo acceder a los controles dentro de un FormView desde el código subyacente?

Protected Sub checkGenEd_CheckedChanged(ByVal sender As Object, _ 
             ByVal e As System.EventArgs) 
    If checkGenEd.Checked = True Then 
     panelOutcome.Visible = True 
    Else 
     panelOutcome.Visible = False 
    End If 
End Sub 

he empezado a resolver esto en base a otras preguntas que miraba para arriba en aquí, pero todos ellos eran en C# en lugar de VB, así que esto es por lo que yo tengo:

Protected Sub FormView1_DataBound(ByVal sender As Object, ByVal e As System.EventArgs) Handles FormView1.DataBound 
    If FormView1.CurrentMode = FormViewMode.Edit Then 

    End If 
End Sub 

Así que sí, no estoy seguro exactamente cómo terminarlo. Lo siento, esto podría ser bastante básico, pero soy nuevo en esto y cualquier ayuda sería apreciada.

EDIT: aquí está mi código ahora:

Protected Sub FormView1_DataBound(ByVal sender As Object, ByVal e As System.EventArgs) Handles FormView1.DataBound 
    If FormView1.CurrentMode = FormViewMode.Edit Then 

     CheckBox checkGenEd = formview1.FindControl("checkGenEd"); 
     Panel panelOutcome = formview1.FindControl("panelOutcome"); 

    End If 
End Sub 

También es mucho decir que checkGenEd y panelOutcome no se declaran.

EDIT: He cambiado mi código para esto, pero aún así no funciona:

Protected Sub FormView1_DataBound(ByVal sender As Object, ByVal e As System.EventArgs) Handles FormView1.DataBound 
    If FormView1.CurrentMode = FormViewMode.Edit Then 

     Dim checkGenEd As CheckBox = FormView1.FindControl("checkGenEd") 
     Dim panelOutcome As Panel = FormView1.FindControl("panelOutcome") 

     If checkGenEd.Checked = True Then 
      panelOutcome.Visible = True 
     Else 
      panelOutcome.Visible = False 
     End If 

    End If 
End Sub 

No hay ningún error más, pero no pasa nada cuando hago clic en la casilla de verificación. Creo que debe haber algún tipo de evento para activarlo, pero no sé cómo se puede poner un controlador de eventos dentro de un controlador de eventos.

Respuesta

10

Con FormView, usted tiene que utilizar control de búsqueda, como en:

CheckBox checkGenEd = (CheckBox)formview1.FindControl("checkGenEd"); 
Panel panelOutcome = (Panel)formview1.FindControl("panelOutcome"); 

no puede hacer referencia un control directamente por ID.

HTH.

+0

Bien, eso tiene sentido, pero ahora me dice que 'CheckBox' es un tipo y no se puede usar como una expresión. – Sara

+0

Creo que normalmente es un error de sintaxis, ¿puedes publicar lo que tienes? También podría probar la sintaxis alternativa anterior ... –

+2

Dim checkGenEd As CheckBox = CType (FormView1.FindControl ("checkGenEd"), CheckBox) para la conversión de vb equivalente. – Tom

2

En VB se necesita utilizar Directcast

Dim chk As Checkbox = DirectCast(Me.FormView1.FindControl("checkgen"), Checkbox) 
+0

Ha publicado lo mismo que la pregunta http://stackoverflow.com/questions/7128764/handles-a-control-in-a-formview-in-asp-net –

2

FormView tiene su propio marco evento. Un control normal dentro de un FormView no generará los eventos de devolución de datos que está buscando. Inicialmente cometí el mismo error. Quería, como tú, generar algún tipo de devolución de datos que pudiera ser interceptada al final del servidor. Una vez que volvamos al servidor, podemos ver los valores en casillas de verificación, etc., dependiendo de las reglas de negocio aplicables. Esto es lo que hice.

En primer lugar poner todos los controles pertinentes dentro de una sección de

<EditItemTemplate> 

dentro del FormView. (Hay otras etiquetas de plantilla que pueden ser más apropiadas). Para generar la devolución de datos, tiene un botón (por ejemplo) como el siguiente. (Esto tiene que ser dentro de la sección EditItemTemplate también):

<asp:linkbutton id="UpdateButton" 
    text="Update" 
    commandname="Update" 
    runat="server"/> 

Puede interceptar este en el servidor con el evento FormView ItemCommand. Por ejemplo:

Private Sub FormView1_ItemCommand(sender As Object, e As System.Web.UI.WebControls.FormViewCommandEventArgs) Handles FormView1.ItemCommand 
    'your code here 
End Sub 

Una vez de nuevo en el servidor a continuación, puede empezar a buscar en los diversos controles para ver lo que tienen, usando FindControl si es necesario. El comando de botón que se muestra arriba es un ejemplo, por lo que es posible que desee usar otro control.

Cuestiones relacionadas