“在编辑记录时RadGrid中无法取消注册带有ID’xxx’的UpdatePanel,因为它没有在ScriptManager中注册…”

让我切入追逐。 我的场景如下:我有自定义添加字段来过滤RadGrid,过滤效果很好。 当我想在RadGrid中使用EditForm编辑记录时,问题出现了。 它曾经工作正常,但后来我选择正确的行有一些问题(我总是选择错误的行)所以这就是我做的修复它。

所以,带filter的RadGrid看起来像这样:

在此处输入图像描述

我所做的是使用Session,这将帮助我们稍后确定过滤后的RadGrid DataSource是否已启动或是否为默认值。

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

之后,我不得不使用if循环设置PreRender来检查之前提到的Session。

 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(); } } 

所以,这解决了我的主要问题,但又给了我一个问题。 我的一些UserControl包含UpdatePanel,每当我尝试从RadGrid clik Edit按钮时,每个UserControl都有它。我收到以下消息: “无法取消注册带有ID’UpdatePanel4’的UpdatePanel,因为它没有在ScriptManager中注册。这可能发生如果UpdatePanel已从控制树中删除,稍后再次添加,则不受支持。参数名称:updatePanel“

我想知道的是如何解决它。

问候,

赫尔沃耶

我不知道为什么,但不知怎的, UpdatePanelScriptManger注销了两次(它也发生在RadGrid.Rebind()方法中;我RadGrid.Rebind()的情况),第二次从ScriptManger取消注册你得到“不能取消注册UpdatePanel …“错误。

解决方法是使用reflection在两个取消注册事件之间的某个位置注册UpdatePanelScriptManger ,如下所示:

 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 }); } 

您应该将UpdatePanel_Unload添加到UpdatePanel_UnloadOnUnload事件:

  

您可以在此处找到问题的完整详细信息

 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  

我也有这个问题..当关闭网格上的pahing到导出到EXCEL时。 我将重新绑定改为mastertableview

即RadGrid1.MasterTableView.AllowPaging = false; RadGrid1.MasterTableView.Rebind();

而不是RadGrid1.MasterTableView.AllowPaging = false; RadGrid1.Rebind();

如果其他人有这个……