2012-01-04 29 views
10

Déjeme ir al grano. Mi escenario es el siguiente: tengo campos agregados personalizados para filtrar el RadGrid y el filtrado funciona perfectamente. El problema surge cuando quiero editar el registro usando EditForm dentro de RadGrid. Solía ​​funcionar bien, pero luego tuve algunos problemas para seleccionar la fila correcta (siempre estaba seleccionando la fila incorrecta) así que esto es lo que hice para solucionarlo."No se puede anular el registro de UpdatePanel con el ID 'xxx' ya que no se ha registrado con el ScriptManager ..." en RadGrid al editar el registro

lo tanto, mi RadGrid con filtros ve así:

enter image description here

Lo que hice es el uso de la Sesión que nos ayudará a determinar posteriormente si se inició el filtrado RadGrid origen de datos o que era el valor por defecto uno.

protected void btnSearch_Click(object sender, EventArgs e) 
{ 
    Session["SearchKontakti"] = "1"; 
} 

Después de eso tuve que configurar PreRender con if loop para verificar la sesión mencionada anteriormente.

protected void gvKontakti_PreRender(object sender, EventArgs e) 
{ 
    int idKontakt = Convert.ToInt32(Request.QueryString["idk"]); 

    if (Session["SearchKontakti"] == "1") 
    { 
     var kontakti = from k in db.Kontakt 
         select k; 

     int idTipUsera = Convert.ToInt32(rcbTipUsera.SelectedValue); 
     int idTvrtka = Convert.ToInt32(rcbTvrtka.SelectedValue); 

     if (rcbTvrtka.SelectedValue != "0") 
     { 
      kontakti = kontakti.Where(k => k.idFirma == idTvrtka); 
     } 

     if (rcbTipUsera.SelectedValue != "0") 
     { 
      kontakti = kontakti.Where(k => k.idOvlasti == idTipUsera); 
     } 

     if (chkAktivan.Checked == true) 
     { 
      kontakti = kontakti.Where(k => k.Aktivan == true); 
     } 
     else 
     { 
      kontakti = kontakti.Where(k => k.Aktivan == false); 
     } 

     int idAuthKontakt = Convert.ToInt32(Session["authenticatedUI"]); 

     if (idKontakt > 0 && idAuthKontakt == idKontakt) 
     { 
      gvKontakti.DataSource = from k in kontakti 
            where k.idKontakt == idKontakt 
            orderby k.Prezime, k.Ime 
            select new { Tvrtka = k.Firma.Naziv, k.idKontakt, Naziv = k.Ime + " " + k.Prezime, Funkcija = k.Funkcija, k.Ime, k.Prezime, k.Tel1, k.Tel2, k.Mob1, k.Mob2, k.Email1, k.Email2, k.Fax, k.Adresa1, k.Adresa2, k.Adresa3, k.Grad, k.PostanskiBroj, k.Drzava, k.Biljeske, k.Aktivan, k.Username, k.Password }; 
     } 
     else if (idKontakt > 0 && idAuthKontakt != idKontakt) 
     { 
      gvKontakti.DataSource = from k in kontakti 
            where k.idKontakt == idKontakt 
            orderby k.Prezime, k.Ime 
            select new { Tvrtka = k.Firma.Naziv, k.idKontakt, Naziv = k.Ime + " " + k.Prezime, Funkcija = k.Funkcija, k.Ime, k.Prezime, k.Tel1, k.Tel2, k.Mob1, k.Mob2, k.Email1, k.Email2, k.Fax, k.Adresa1, k.Adresa2, k.Adresa3, k.Grad, k.PostanskiBroj, k.Drzava, k.Biljeske, k.Aktivan, k.Username, k.Password }; 
     } 
     else 
     { 
      gvKontakti.DataSource = from k in kontakti 
            orderby k.Prezime, k.Ime 
            select new { Tvrtka = k.Firma.Naziv, k.idKontakt, Naziv = k.Ime + " " + k.Prezime, Funkcija = k.Funkcija, k.Ime, k.Prezime, k.Tel1, k.Tel2, k.Mob1, k.Mob2, k.Email1, k.Email2, k.Fax, k.Adresa1, k.Adresa2, k.Adresa3, k.Grad, k.PostanskiBroj, k.Drzava, k.Biljeske, k.Aktivan, k.Username, k.Password }; 
     } 

     gvKontakti.DataBind(); 
    } 
} 

Por lo tanto, esto solucionó mi problema principal, pero me dio otro. Algunos de mis UserControls contienen UpdatePanel y para cada UserControl que lo tiene cada vez que trato de clik Editar botón de RadGrid Recibo el siguiente mensaje: "No se puede cancelar UpdatePanel con ID 'UpdatePanel4' ya que no se ha registrado con ScriptManager. ocurrir si el UpdatePanel se eliminó del árbol de control y luego se agregó de nuevo, lo que no es compatible. Nombre del parámetro: updatePanel "

Lo que me gustaría saber es cómo solucionarlo.

Saludos,

Hrvoje

Respuesta

32

no sé por qué, pero de alguna manera el UpdatePanel es no registrado desde el ScriptManger dos veces (que ocurre en RadGrid.Rebind() método también, la situación que se ha quedado atascado en), y el La segunda vez que no está registrado desde ScriptManger, aparece el error "No se puede cancelar el registro de UpdatePanel ...".

La solución consiste en registrar el UpdatePanel con el ScriptManger en algún lugar entre los dos eventos anular el registro, utilizando la reflexión, así:

protected void UpdatePanel_Unload(object sender, EventArgs e) { 
    MethodInfo methodInfo = typeof(ScriptManager).GetMethods(BindingFlags.NonPublic | BindingFlags.Instance) 
     .Where(i => i.Name.Equals("System.Web.UI.IScriptManagerInternal.RegisterUpdatePanel")).First(); 
    methodInfo.Invoke(ScriptManager.GetCurrent(Page), 
     new object[] { sender as UpdatePanel }); 
} 

debe agregar el UpdatePanel_Unload al evento OnUnload del UpdatePanel:

<asp:UpdatePanel ID="UpdatePanel1" runat="server" OnUnload="UpdatePanel_Unload"> 

Puede encontrar los detalles completos del problema here

+0

Esto funcionó para mí cuando estaba moviendo controles dentro de un Panel. Acabo de vincular programáticamente el evento Descargar de cualquier Panel de actualización a su método anterior. Funcionó como un amuleto, no tuvo que registrarlos ni nada. –

+0

Seguí tu respuesta, pero no me ayudó ... – pcs

+0

Lo tengo gracias ...... – pcs

1
Protected Sub UpdatePanel_Unload(ByVal sender As Object, ByVal e As EventArgs) 
    Dim methodInfo As MethodInfo = GetType(ScriptManager).GetMethods(BindingFlags.NonPublic Or BindingFlags.Instance).Where(Function(i) i.Name.Equals("System.Web.UI.IScriptManagerInternal.RegisterUpdatePanel")).First() 
    methodInfo.Invoke(ScriptManager.GetCurrent(Page), New Object() {TryCast(sender, UpdatePanel)}) 
End Sub 


<asp:UpdatePanel ID="UpdatePanel1" runat="server" OnUnload="UpdatePanel_Unload"> 
1

Tuve este problema también ... cuando apagué el peeling en la cuadrícula para exportar a EXCEL. He cambiado la reenlace para estar en la vista de maestraje

es decir RadGrid1.MasterTableView.AllowPaging = false; RadGrid1.MasterTableView.Rebind();

en lugar de RadGrid1.MasterTableView.AllowPaging = false; RadGrid1.Reencuadernar();

En caso de que alguien más haya tenido esto ...

Cuestiones relacionadas