我有一个带有UpdatePanel的页面,其中包含一个Repeater和一个文本框,其中包含转发器中的项目数。当我更改值时,页面应该回发并使用更新的项目数重绘重复器。这在原则上是有效的,但页面在回发后结束并且不接受任何输入 - 仅在IE 8中。它在Firefox中运行得非常好。例如,当我右键单击控件时,不会出现上下文菜单,我无法在文本框中输入文本。
当我取出UpdatePanel时,页面工作正常,但当然每次回发事件都会刷新。这不一定与页面上的Repeater有关。我想我在其他页面上看到了这一点。这里的诀窍是什么?
<asp:UpdatePanel ID="uPanel" runat="server" UpdateMode="Conditional"
EnableViewState="true" ChildrenAsTriggers="true">
<ContentTemplate>
<asp:Panel ID="Panel1" runat="server" DefaultButton="btnSubmit">
<asp:TextBox ID="tbItems" runat="server" AutoPostback="true"
OnTextChanged="textchanged_Items"/>
<asp:Repeater id="rptItems" runat="server"
OnItemDataBound="repeaterItem_Databound">
<...>
</asp:Repeater>
protected void textchanged_Items(object sender, EventArgs e) {
try {
// this methods rebinds the repeater to a List after changing
// the number of items in the list
ReflowItemRepeater();
// This is not really necessary, since Databind() appears to
// cause an update. I tried it anyways.
uPanel.Update();
}
catch (Exception ex) {
ShowError(this, "Error displaying the item list.", ex, true);
}
}
我最终删除了更新面板。
一个月之后,不同的页面,我仍然在为此而斗争。情况是一样的。 更新面板,转发器(实际上是2个嵌套转发器),以及转发器中用于触发回发事件的控件。服务器正确处理事件并返回控制权,但浏览器(IE8)永远不会刷新更新面板。页面没有响应,好像处于某种死锁状态。我可以通过单击触发另一个回发事件的按钮(也在更新面板中)来解锁它。但是,当发生这种情况时,面板中的文本框不可单击或可编辑。 而且,它只是第一次发生。一旦我“释放”了锁或其他任何东西,它就不会再发生在这个页面上,即使我重复了导致它的完全相同的步骤。
发生这种情况时,JIT调试器不会报告任何内容。
答案 0 :(得分:1)
我实际上会在您的更新面板中设置触发器。
我不确定您是否需要在代码中调用.Update,因为更新面板将在触发器发生时更新。
试试这个:
答案 1 :(得分:0)
我的直觉是它与使用OnTextChanged事件有关。对于踢,请尝试在文本框旁边添加一个按钮,然后在单击按钮时重排转发器。 IE仍然会冻结吗?
答案 2 :(得分:0)
所以我把这个页面剥离到最低限度,我发现了它正在做什么 - AjaxToolkit:CalendarExtender。如果我拿出来,一切正常。不过,我很想知道是否有解决方法。
这是link to my test page。我会保持几天。
要查看问题,请从下拉列表中选择“2”,然后在第一个数量字段中输入内容并标签输出。光标将在下一个字段中闪烁,但不允许输入。这发生在IE8中,而不是在Firefox中。
编辑:实际上,当我回到整页并删除CalendarExtender时,它仍然无法正常工作。我怀疑这个问题与在UpdatePanel中发布的控件有关,但我无法将其固定下来。看起来似乎是x事物组合不起作用的事情之一,而(x-1)事物的任何组合都有效。
答案 3 :(得分:0)
关于最初的问题,这是一个工作样本。我不知道它是否有用,但只是为了确保......
<%@ Page Language="C#" %>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server"><title>Ajax Test</title></head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager runat="server" />
<asp:UpdatePanel runat="server" ChildrenAsTriggers="true">
<ContentTemplate>
<asp:Label runat="server" AssociatedControlID="txtTest">
Enter 'fruit' or 'vegetables':
</asp:Label>
<asp:TextBox
runat="server" ID="txtTest" AutoPostBack="true"
OnTextChanged="Handler_Test_TextChanged"
/>
<asp:Repeater runat="server" ID="rptItems">
<HeaderTemplate><ul></HeaderTemplate>
<ItemTemplate><li><%# Container.DataItem.ToString() %></li></ItemTemplate>
<FooterTemplate></ul></FooterTemplate>
</asp:Repeater>
</ContentTemplate>
</asp:UpdatePanel>
</form>
</body>
</html>
<script runat="server">
static readonly string[] Fruit = new string[]
{ "Apples", "Oranges", "Bananas", "Pears" };
static readonly string[] Veg = new string[]
{ "Potatoes", "Carrots", "Tomatoes", "Onion" };
void Handler_Test_TextChanged(object s, EventArgs e)
{
if(txtTest.Text == "fruit") rptItems.DataSource = Fruit;
else if(txtTest.Text == "vegetables") rptItems.DataSource = Veg;
else return;
rptItems.DataBind();
}
</script>