"Невозможно отменить регистрацию UpdatePanel с идентификатором" xxx ", поскольку он не был зарегистрирован в ScriptManager..." в RadGrid при записи редактирования
Позволь мне разрезать погоню. Мой сценарий выглядит следующим образом: у меня есть настраиваемые поля для фильтрации RadGrid, и фильтрация работает отлично. Проблема возникает, когда я хочу редактировать запись с помощью EditForm внутри RadGrid. Он работал нормально, но потом у меня возникли проблемы с выбором правой строки (я всегда получал неправильную строку), поэтому я это сделал, чтобы исправить ее.
Итак, мои RadGrid с фильтрами выглядят так:
![enter image description here]()
То, что я сделал, это использовать сеанс, который поможет нам позже определить, был ли запущен фильтрованный источник RadGrid DataSource или был по умолчанию.
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();
}
}
Итак, это фиксировало мою основную проблему, но дало мне еще одну. Некоторые из моих UserControl содержат UpdatePanel и для каждого UserControl, который имеет его всякий раз, когда я пытаюсь клик редактировать кнопку RadGrid. Я получаю следующее сообщение: "Нельзя отменить регистрацию UpdatePanel с идентификатором" UpdatePanel4 ", так как он не был зарегистрирован в ScriptManager. Это может произойти, если UpdatePanel был удален из дерева управления и позже добавлен снова, что не поддерживается.
Имя параметра: updatePanel "
Я хотел бы знать, как это исправить.
Привет,
Хрвого
Ответы
Ответ 1
Я не знаю почему, но почему-то UpdatePanel
дважды не регистрируется из ScriptManger
(это происходит и в методе RadGrid.Rebind()
, ситуация, в которой я застрял), и во второй раз, когда он был незарегистрирован из ScriptManger вы получаете сообщение "Can not unregister 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">
Здесь вы можете найти полную информацию о проблеме
Ответ 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">
Ответ 3
У меня тоже была эта проблема... при выключении pahing на сетке для экспорта в EXCEL.
Я изменил повторную привязку, чтобы быть в mastertableview
т.е. RadGrid1.MasterTableView.AllowPaging = false; RadGrid1.MasterTableView.Rebind();
вместо RadGrid1.MasterTableView.AllowPaging = false; RadGrid1.Rebind();
Если у кого-то это было...