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

时间:2012-01-04 13:26:14

标签: c# asp.net user-controls updatepanel radgrid

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

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

enter image description here

我所做的是使用会话,这将有助于我们稍后确定过滤后的RadGrid数据源是否已启动或是默认的。

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,每当我尝试从RadGrid clik Edit按钮时,每个UserControl都有它。我收到以下消息:“无法取消注册带有ID'UpdatePanel4'的UpdatePanel,因为它没有在ScriptManager中注册。如果UpdatePanel已从控制树中删除并稍后再次添加(可能不受支持),则可能会发生这种情况。 参数名称:updatePanel“

我想知道的是如何修复它。

此致

赫尔沃耶

3 个答案:

答案 0 :(得分:36)

我不知道为什么,但不知怎的,UpdatePanelScriptManger取消注册两次(它也发生在RadGrid.Rebind()方法中;我遇到的情况),以及第二次从ScriptManger取消注册时,您会收到“无法取消注册UpdatePanel ...”错误。

解决方法是使用反射在两个取消注册事件之间的某处注册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的OnUnload事件中:

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

您可以找到问题here

的完整详细信息

答案 1 :(得分:2)

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">

答案 2 :(得分:1)

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

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

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

如果其他人有这个......