让我切入追逐。我的场景如下:我有自定义添加字段来过滤RadGrid,过滤效果很好。当我想在RadGrid中使用EditForm编辑记录时出现问题。它过去工作正常,但是我在选择正确的行时遇到了一些问题(我总是选择错误的行)所以这就是我所做的修复它。
所以,带过滤器的RadGrid看起来像这样:
我所做的是使用会话,这将有助于我们稍后确定过滤后的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“
我想知道的是如何修复它。
此致
赫尔沃耶
答案 0 :(得分:36)
我不知道为什么,但不知怎的,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
添加到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();如果其他人有这个......