2011-05-06 25 views
5

He estado buscando una solución a esto por un tiempo y aunque visto muchos mensajes que me muestran cómo hacerlo, pero todavía no puedo conseguir mi caso SelectedIndexChanged al fuego cuando se cambia el DropDownList.DropDownList SelectedIndexChanged dentro de Gridview no se activa!

El DropDownList AutoPostBack se establece en True, he seguido código en el siguiente post también: Link to post

Aquí está mi código:

.ASPX

<asp:GridView ID="gvCases" DataKeyNames="UserId" runat="server" AutoGenerateColumns="False" 
    BorderWidth="0px" CssClass="gridList" GridLines="None"> 
    <AlternatingRowStyle BackColor="#F7F7F7" /> 
    <Columns> 

     <asp:BoundField DataField="id" HeaderText="Case Ref" /> 

     <asp:TemplateField HeaderText="Name"> 
      <ItemTemplate> 
       <asp:Label ID="clientName" runat="server" Text="Label"></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 

     <asp:BoundField DataField="company" HeaderText="Company" /> 

     <asp:TemplateField HeaderText="Order Date"> 
      <ItemTemplate> 
       <asp:Label ID="dateTime" runat="server" Text="Label"></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 

     <asp:TemplateField HeaderText="Case Owner"> 
      <ItemTemplate> 
       <asp:DropDownList ID="iconUsers" runat="server" OnSelectedIndexChanged="iconUsers_SelectedIndexChanged"> 
       </asp:DropDownList> 
      </ItemTemplate> 
     </asp:TemplateField> 

     <asp:TemplateField ShowHeader="False"> 
      <ItemTemplate> 
       <asp:Button ID="btnDetails" runat="server" CausesValidation="False" Text="Details" /> 
      </ItemTemplate> 
     </asp:TemplateField> 

     <asp:TemplateField ShowHeader="False"> 
      <ItemTemplate> 
       <asp:Button ID="btnSchedule" runat="server" CausesValidation="False" Text="Schedule" /> 
      </ItemTemplate> 
     </asp:TemplateField> 



    </Columns> 
</asp:GridView> 

.vb

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 


    If (Request.IsAuthenticated = False) Then 
     Response.Redirect("~/admin/default.aspx") 
    End If 


    Dim keypadSQL As SqlConnection = New SqlConnection() 
    keypadSQL.ConnectionString = ConfigurationManager.ConnectionStrings("connKeypad").ConnectionString() 


    Dim cmdActive As SqlCommand = New SqlCommand() 
    cmdActive.Connection = keypadSQL 
    cmdActive.CommandText = "spCasesActive" 
    cmdActive.CommandType = CommandType.StoredProcedure 


    Dim daCases As SqlDataAdapter = New SqlDataAdapter 
    daCases.SelectCommand = cmdActive 

    Dim dsCases As DataSet = New DataSet() 
    daCases.Fill(dsCases, "CaseList") 

    Dim CaseTotal As Integer 
    CaseTotal = dsCases.Tables(0).Rows.Count 

    If CaseTotal = 1 Then 
     iCaseTotal.InnerHtml = CaseTotal & " Case" 
    Else 
     iCaseTotal.InnerHtml = CaseTotal & " Cases" 
    End If 

    gvCases.DataSource = dsCases 
    gvCases.DataBind() 
    cmdActive.Dispose() 


    If Page.IsPostBack Then 

    End If 

End Sub 

Protected Sub gvCases_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gvCases.RowDataBound 

    If e.Row.RowType = DataControlRowType.Header Then 

     gvCases.Columns(5).ItemStyle.Width() = "60" 
     gvCases.Columns(6).ItemStyle.Width() = "70" 

    End If 

    If e.Row.RowType = DataControlRowType.DataRow Then 

     Dim rowView As DataRowView = CType(e.Row.DataItem, DataRowView) 

     Dim strClientName As String 
     Dim clientName As Label 
     strClientName = rowView("firstname") & " " & rowView("lastname") 
     clientName = CType(e.Row.FindControl("clientName"), Label) 
     clientName.Text = strClientName 

     Dim strDateTime As String 
     Dim dateTime As Label 
     strDateTime = rowView("CaseSent") 
     dateTime = CType(e.Row.FindControl("dateTime"), Label) 
     dateTime.Text = FormatDateTime(strDateTime, DateFormat.ShortDate) & "<br />" & FormatDateTime(strDateTime, DateFormat.ShortTime) 

     gvCases.Columns(3).ItemStyle.Font.Size = 8 
     gvCases.Columns(5).ControlStyle.CssClass = "btnEdit" 
     gvCases.Columns(6).ControlStyle.CssClass = "btnSchedule" 

     Dim intUserId As String 
     intUserId = Convert.ToString(gvCases.DataKeys(e.Row.RowIndex).Value) 



     Dim cmd As New SqlCommand("SELECT id, Firstname, Lastname, Firstname + ' ' + Lastname As FullName FROM [users_icon] ORDER BY Firstname, Lastname", New SqlConnection(ConfigurationManager.ConnectionStrings("connKeypad").ConnectionString())) 
     cmd.Connection.Open() 

     Dim ddlValues As SqlDataReader 
     ddlValues = cmd.ExecuteReader() 

     Dim iconUsers As DropDownList 
     iconUsers = CType(e.Row.FindControl("iconUsers"), DropDownList) 
     iconUsers.Style.Add("font-size", "11px") 
     iconUsers.DataSource = ddlValues 
     iconUsers.DataValueField = "id" 
     iconUsers.DataTextField = "FullName" 
     iconUsers.DataBind() 

     Dim ListItem1 = New ListItem("Select Case Owner", "0") 
     iconUsers.Items.Insert("0", ListItem1) 
     iconUsers.AutoPostBack = True 
     If IsDBNull(rowView("CaseOwner")) Then 
      iconUsers.SelectedValue = 0 
     Else 
      iconUsers.SelectedValue = rowView("CaseOwner") 
     End If 

     AddHandler iconUsers.SelectedIndexChanged, AddressOf iconUsers_SelectedIndexChanged 

     cmd.Connection.Close() 
     cmd.Connection.Dispose() 


     Dim btnDetails As Button = CType(e.Row.FindControl("btnDetails"), Button) 
     btnDetails.PostBackUrl = "~/admin/detail.aspx?uid=" & intUserId 

     Dim LabelAddress As Button = CType(e.Row.FindControl("btnSchedule"), Button) 
     LabelAddress.PostBackUrl = "~/admin/schedule.aspx?uid=" & intUserId 

    End If 

End Sub 

Protected Sub iconUsers_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) 

    Response.Write("Function Called") 

End Sub 

Gracias por cualquier ayuda. J.

+0

Sí lo es, dentro de gvCases_RowDataBound - iconUsers.AutoPostBack = True – JBoom

+0

Está activado o desactivado ViewState? – Jeff

+0

Establecer para heredar en gridview y menú desplegable, solo debe establecerse en el valor predeterminado para la página, así que supongo que eso está habilitado? – JBoom

Respuesta

6

Hay algunas preguntas similares (ver Event handler not firing using AddHandler y Assign an event to a custom control inside a Repeater control), pero su caso en particular se ve como va a añadir el manejador de dos veces; una vez en el marcado, y una vez en databound.

Quitaría el que está en el evento RowDataBound (ya que no está haciendo nada, porque el controlador se perderá cuando publique de nuevo, y el controlador se agrega después de que el evento realmente se active). Además, asegúrese de que AutoPostBack como @Bala menciona.

+1

he cambiado ligeramente mi código, he tomado el controlador de eventos y AutoPostBack de código subyacente y la puse en mi .ASPX - , pero todavía no está disparando :(, estoy bien y verdaderamente atascado. – JBoom

+0

así que la página es la publicación de la espalda, que va a depurar, y nunca pegó en el punto de interrupción que ha establecido para iconUsers_SelectedIndexChanged? Sí eso es –

+0

Ian correcta, nunca se vuelve al punto de quiebre cuando cambio una de las dropdownlists – JBoom

4

Usted dice AutoPostBack se establece en true pero no lo veo en el marcado y de manera predeterminada está configurado en falso. Así que trate de

<asp:DropDownList ID="iconUsers" runat="server" OnSelectedIndexChanged="iconUsers_SelectedIndexChanged" AutoPostBack="true"> 
      </asp:DropDownList> 
+0

Hola Bala, es en código detrás de esta línea gvCases_RowDataBound: iconUsers.AutoPostBack = True. Puedo ver que la página también está publicando cuando cambio la lista desplegable, pero el evento no se activará. – JBoom

Cuestiones relacionadas