«Невозможно отменить регистрацию UpdatePanel с идентификатором« xxx », поскольку он не был зарегистрирован в ScriptManager ...» в RadGrid при редактировании записи. - PullRequest
12 голосов
/ 04 января 2012

Позвольте мне перейти к преследованию.Мой сценарий выглядит следующим образом: у меня есть пользовательские добавленные поля для фильтрации RadGrid, и фильтрация работает отлично.Проблема возникает, когда я хочу редактировать запись, используя EditForm внутри RadGrid.Раньше все работало нормально, но потом у меня возникли проблемы с выбором правильной строки (я всегда выбирал неправильную строку), так что это то, что я сделал, чтобы это исправить.например:

enter image description here

Я использовал сессию, которая поможет нам позже определить, был ли отфильтрован источник данных RadGrid или он был по умолчанию.

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

После этого мне пришлось установить в PreRender цикл if для проверки ранее упомянутой сессии.

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

Итак, это исправило мою основную проблему, но дало мне еще одну.Некоторые из моих UserControls содержат UpdatePanel, и для каждого UserControl, который имеет его всякий раз, когда я пытаюсь нажать кнопку «Изменить» в RadGrid, я получаю следующее сообщение: «Невозможно отменить регистрацию UpdatePanel с идентификатором« UpdatePanel4 », поскольку он не был зарегистрирован в ScriptManager.Это может произойти, если UpdatePanel был удален из дерева элементов управления и позже добавлен снова, что не поддерживается. Имя параметра: updatePanel "

Что я хотел бы знать, так это как это исправить.

С уважением,

Hrvoje

Ответы [ 3 ]

37 голосов
/ 05 февраля 2012

Я не знаю почему, но почему-то UpdatePanel дважды не регистрируется из ScriptManger (это происходит и в методе 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 к событию OnUnload UpdatePanel:

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

Вы можете найти полную информацию о проблеме здесь

3 голосов
/ 10 октября 2016
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 голос
/ 09 января 2017

У меня тоже была эта проблема .. при отключении разметки сетки на экспорт в EXCEL Я изменил привязку, чтобы быть на mastertableview

т.е. RadGrid1.MasterTableView.AllowPaging = false; RadGrid1.MasterTableView.Rebind ();

вместо RadGrid1.MasterTableView.AllowPaging = false; RadGrid1.Rebind ();

На случай, если кто-то еще имел это ...

...