在编辑RadGrid记录时,由于未在ScriptManager中注册,无法注销ID为“xxx”的UpdatePanel...

13

让我来直接说明。我的情况如下:我已经添加了自定义字段以过滤RadGrid,过滤正常工作。问题出现在当我想要使用RadGrid内的EditForm编辑记录时。它曾经运行良好,但是我有一些选择正确行的问题(我总是选择错误的行),所以这就是我为解决这个问题所做的事情。

所以,我的带有过滤器的RadGrid看起来像这样:

enter image description here

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

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

之后我不得不设置PreRender和if循环来检查之前提到的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,对于每个具有UpdatePanel的UserControl,当我尝试从RadGrid单击“Edit”按钮时,会收到以下消息:"Cannot unregister UpdatePanel with ID 'UpdatePanel4' since it was not registered with the ScriptManager. This might occur if the UpdatePanel was removed from the control tree and later added again, which is not supported. Parameter name: updatePanel"

我想知道如何解决它。

谢谢,

Hrvoje

3个回答

44

我不知为何,但某种方式 UpdatePanelScriptManger 注销了两次(在 RadGrid.Rebind() 方法中也会发生;这就是我卡住的情况),第二次从 ScriptManger 注销时,会出现“无法注销 UpdatePanel…” 的错误信息。

解决方法是在两个取消注册事件之间使用反射将 UpdatePanel 注册到 ScriptManger 中,像这样:

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 的 OnUnload 事件中:

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

你可以在这里找到问题的完整细节。


当我在移动面板内的控件时,这对我很有效。我只是通过编程将任何UpdatePanels的Unload事件绑定到您上面的方法。像魔法一样运作-不需要重新注册它们或其他任何东西。 - Mark Williams
页面无法加载,请稍后再试。 - Arsalan Khan

3
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
我也遇到了这个问题...在将网格的分页关闭后,导出到Excel时。 我将重新绑定更改为在主表视图上进行。
即 RadGrid1.MasterTableView.AllowPaging = false; RadGrid1.MasterTableView.Rebind();
而不是 RadGrid1.MasterTableView.AllowPaging = false; RadGrid1.Rebind();
如果有其他人遇到这个问题...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接