2012-01-04 56 views
10

讓我切入正題。我的情況如下:我有自定義添加字段來過濾RadGrid和過濾完美。問題出現在我想使用RadGrid內的EditForm編輯記錄時。它曾經工作得很好,但之後我在選擇正確的行時遇到了一些問題(我總是選錯了行),所以這就是我所做的修正。「在編輯記錄時,無法取消註冊ID爲'xxx'的UpdatePanel,因爲它未在ScriptManager中註冊......」在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(); 
    } 
} 

因此,這固定了我的主要問題,但給了我另一個問題。我的一些用戶控件包含UpdatePanel,並且對於每個擁有它的用戶控件,每當我試圖從RadGrid中修改編輯按鈕時,我都會收到以下消息:「無法註銷帶有標識'UpdatePanel4'的UpdatePanel,因爲它沒有在ScriptManager中註冊。如果UpdatePanel已從控件樹中刪除,並且稍後再次添加,則不支持。 參數名稱:updatePanel「

我想知道的是如何解決該問題。

問候,

赫爾沃耶

回答

32

我不知道爲什麼,但不知何故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_UnloadOnUnload事件在UpdatePanel的:

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

你可以找到問題的完整細節here

+0

這對我在移動控制面板內的控制時工作。我只是以編程方式將任何UpdatePanels的Unload事件綁定到上面的方法。像魅力一樣工作 - 不必註冊或回收任何東西。 – 2012-09-26 20:41:01

+0

我確實按照你的答案,但它沒有幫助我.. – pcs 2015-10-15 05:21:48

+0

得到它謝謝...... – pcs 2015-10-16 06:55:40

1
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

我也有這個問題,當關閉網格上的pahing導出到EXCEL。 我將重新綁定在mastertableview上

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

而不是 RadGrid1.MasterTableView.AllowPaging = false; RadGrid1。重新綁定();

如果有人有這個...