更新面板中 asp.net Telerik RadListView 不会刷新
本文关键字:RadListView 刷新 Telerik net asp 更新 | 更新日期: 2023-09-27 18:27:08
在过去的几天里,我一直在用头撞墙,试图让这个场景发挥作用。
我在页面上有一个<asp:UpdatePanel>
,它有一个外部触发器并包含一个 Telerik RadListView
:
<asp:UpdatePanel runat="server" ID="RationUpdatePanel" UpdateMode="Conditional" ChildrenAsTriggers="true">
<ContentTemplate>
<telerik:RadListView ID="RationListView runat="server"
DataSourceId="RationDataSource"
OnItemCanceling="ItemCancelingHandler"
OnItemEditing="ItemEditingHandler"
OnItemUpdating="ItemUpdateHandler">
<LayoutTemplate>
<table>
<thead>
<tr>...</tr>
</thead>
<tbody>
<tr id="itemPlaceHolder" runat="server"/>
</tbody>
</table>
</LayoutTemplate>
<ItemTemplate>
<tr>
<td>
<asp:LinkButton ID="EditButton" runat="server" CausesValidation="False" CommandName="Edit" Text="Edit" ToolTip="Edit" />
<asp:LinkButton ID="DeleteButton" runat="server" CausesValidation="False" CommandName="Delete" Text="Delete" ToolTip="Delete" />
</td>
<td>...</td>
</tr>
</ItemTemplate>
<EditItemTemplate>
<tr>
<td>
<asp:LinkButton ID="SaveButton" runat="server" CausesValidation="False" CommandName="Save" Text="Save" ToolTip="Save" />
<asp:LinkButton ID="CancelButton" runat="server" CausesValidation="False" CommandName="Cancel" Text="Cancel" ToolTip="Update" />
</td>
<td>...</td>
</tr>
</EditItemTemplate>
</telerik:RadListView>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="UseRationButton" EventName="Click" />
</Triggers>
</UpdatePanel>
隐藏的代码如下所示:
protected void RationListView_ItemEditing(object sender, RadListViewCommandEventArgs e)
{
((RadListViewDataItem)e.ListViewItem).Edit = true;
}
protected void RationListView_ItemCanceling(object sender, RadListViewCommandEventArgs e)
{
RationListView.ClearEditItems();
((RadListViewDataItem)e.ListViewItem).Edit = false;
}
单击EditButton
或CancelButton
生成预期的事件,并调用用于重新绑定列表的 ObjectDataSource 例程,但更新面板不会刷新。 从事件处理程序调用RationUpdatePanel.Update()
不会改变这种情况。 代码在更新面板之外正常工作:模式更改并显示其他模板中的按钮。
在任一情况下,单击外部触发器都会导致显示列表。
更新:我在浏览器中的PageManager类中添加了几个javascript回调,用于beginRequest和endRequest。 这些仅在事件发生时显示警报。
该页面包含几个元素,基本上看起来像这样(详细信息省略(:
<div>
<div>
<asp:DropDownList ID="RationDdl"/>
<asp:Button ID="UseRationButton"/>
</div>
<div>
<asp:DropDownList ID="AnimalGroupDdl"/>
<asp:UpdatePanel ID="AnimalWeightUpdatePanel"/>
<ContentTemplate>
<asp:DropDownList ID="AnimalWeightDdl"/>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</div>
<div>
<telerik:RadListBox>
</telerik:RadListBox>
</div>
<div>
<asp:UpdatePanel ID="FeedPreviewUpdatePanel">
<ContentTemplate>
<asp:Repeater>
</asp:Repeater>
</ContentPanel>
</asp:UpdatePanel>
</div>
<div>
<!-- this contains the update panel shown above -->
</div>
第一个div 中的UseFeedRationButton
是RationUpdatePanel
的外部触发器。 AnimalGroupDdl
是AnimalWeightUpdatePanel
的外部触发器。 上的 SelectedIndexChanged 事件的处理程序AnimalGroupDdl
填充AnimalWeightDdl
的可用权重类选定的组。 它与RationUpdatePanel
或FeedPreviewUpdatePanel
没有交互。
这是UseRationButton
的标记:
<asp:Button ID="UseRationButton" runat="server"
Text="Use This Ration"
OnClick="UseRationButton_Click"
CausesValidation="true"
ValidationGroup="UseRation"
UseSubmitBehavior="false">
</asp:Button>
下面是背后的代码:
protected void UseRationButton_Click(object sender, EventArgs e)
{
string text = this.RationDdl.SelectedItem.Text;
this.RationNameLabel.Text = text;
this.RationDataSource.SelectParameters["RationId"].DefaultValue = this.RationDdl.SelectedValue;
}
我一直在测试两种方案:
1( 从RationDdl
中选择配给,然后单击UseRationButton
2( 选择一个动物组,然后执行场景 1。
在方案 1 中,异步回发由客户端 asp.net 代码启动,按钮事件由服务器端处理。 已填充 RationListView,但客户端 endRequest 代码永远不会执行(不显示警报(。 随后单击 RadListView 中的控件会触发异步回发,但列表的状态不会更改,并且不会执行客户端 endRequest 代码。
在方案 2 中,启动异步回发,在服务器端处理事件并填充AnimalWeightDdl
。 在这种情况下,将执行客户端 endRequest 代码(显示警报(。 在此之后,选择配给并单击使用配给按钮启动回发,填充列表视图并执行 endRequest 代码。 此时,单击列表视图中的按钮会导致启动异步回发,更改列表的状态并执行 endRequest 代码。
我的工作理论是,某些东西导致客户端上的页面请求管理器类的状态变得模糊,但我无法弄清楚可能是什么原因造成的。
首先,如果你使用Telerik rad控制,我建议你把asp:button
改成telerik:RadButton
。
这是示例
<telerik:RadButton ID="v" runat="server" Text="Use This Ration"
AutoPostBack="true"
ValidationGroup="UseRation" OnClick="UseRationButton_Click">
</telerik:RadButton>
protected void UseRationButton_Click(object sender, EventArgs e)
{
string text = this.RationDdl.SelectedItem.Text;
this.RationNameLabel.Text = text;
this.RationDataSource.SelectParameters["RationId"].DefaultValue = this.RationDdl.SelectedValue;
}
请注意,您应该将AutoPostBack="true"
添加到radButton中。
而这个链接,MSDN参考1和MSDN参考2将显示使用更新面板的详细信息。
我在周五和周六早上所做的研究为这个问题提供了答案。
我有一些代码附加到 Sys.WebForms.PageRequestManager
endRequest 事件,该事件更新了一个文本框,其中包含新口粮的临时标题。 代码如下所示:
///
/// reregister the change handlers after reloading the animal weight ddl and create a
/// temporary name for the ration based on animal choice and weight.
///
function animalWeightDdlOnLoad() {
var ddl = document.getElementById("<%= AnimalWeightDdl.ClientID %>");
//
// add event handler in a browser agnostic fashion
//
if (ddl.addEventListener) {
ddl.addEventListener("change", animalWeightDdlOnChange);
}
else if (ddl.attachEvent) {
ddl.attachEvent("onchange", animalWeightDdlOnChange);
}
else {
ddl.onchange = animalWeightDdlOnChange;
}
animalWeightDdlOnChange();
}
animalWeightDdlOnChange()
参考了动物体重DDL的选项列表:
///
/// create a temporary name for the ration
///
function animalWeightDdlOnChange() {
var ddl1 = document.getElementById("<%= AnimalGroupDdl.ClientID %>");
var ddl2 = document.getElementById("<%= AnimalWeightDdl.ClientID %>");
var text = document.getElementById("<%= RationNameText.ClientID %>");
text.value = ddl1.options[ddl1.selectedIndex].text + ' ' + ddl2.options[ddl2.selectedIndex].text + ' - Copy';
}
但是,如果尚未填充列表,则对选项的引用会导致错误,从而停止 endRequest 处理。 我没有在每个异步请求上运行此代码,而是将其更改为动物组 ddl 上更改事件的处理程序,如下所示:
function animalGroupDdlOnSelectedChanged() {
//
// add a handler for the endRequest event which will be triggered by
// fetching the contents of the weight ddl.
//
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(animalWeightDdlOnLoad);
}
然后在animalWeightDdlOnLoad()
我添加了一行,以便在请求有跑。 这可确保权重 ddl 的更改处理程序仅在填充列表后运行。 问题解决了。 但为了以防万一,我添加了对动物重量 ddl 选项列表长度的检查。
因此,即使是看似无辜的javascript也会破坏浏览器中的异步请求处理。