Gor*_*son 5 asp.net updatepanel repeater asp.net-ajax .net-2.0
在用户控件中,我在UpdatePanel内部有一个Repeater(在ModalPopupExtender中显示了id.使用MyDTO对象的数组列表对Repeater进行数据绑定.列表中的每个Item都有两个按钮.设置了ImageURL和CommandArgument.
这段代码第一次正常工作但此后CommandArgument是错误的.看起来显示器正确更新但DTO不是,并且发送的CommandArgument是刚刚删除的.
任何人都可以发现代码的任何问题吗?
编辑:我刚刚在代码中添加了一个CollapsiblePanelExtender.当我现在删除一个项目并展开面板时,之前已删除(并从显示中删除)的项目已经返回.似乎在发动机罩下没有正确重建中继器.
ASCX
<asp:UpdatePanel ID="ViewDataDetail" runat="server" ChildrenAsTriggers="true">
<Triggers>
<asp:PostBackTrigger ControlID="ViewDataCloseButton" />
<asp:AsyncPostBackTrigger ControlID="DataRepeater" />
</Triggers>
<ContentTemplate>
<table width="100%" id="DataResults">
<asp:Repeater ID="DataRepeater" runat="server" OnItemCommand="DataRepeater_ItemCommand" OnItemDataBound="DataRepeater_ItemDataBound">
<HeaderTemplate>
<tr>
<th><b>Name</b></th>
<th><b> </b></th>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<b><%#((MyDTO)Container.DataItem).Name%></b>
</td>
<td>
<asp:ImageButton CausesValidation="false" ID="DeleteData" CommandName="Delete" runat="server" />
<asp:ImageButton CausesValidation="false" ID="RunData" CommandName="Run" runat="server" />
</td>
</tr>
<tr>
<td colspan="2">
<table>
<tr>
<td>Description : </td>
<td><%#((MyDTO)Container.DataItem).Description%></td>
</tr>
<tr>
<td>Search Text : </td>
<td><%#((MyDTO)Container.DataItem).Text%></td>
</tr>
</table>
</td>
</tr>
</ItemTemplate>
</asp:Repeater>
</table>
</ContentTemplate>
</asp:UpdatePanel>
Run Code Online (Sandbox Code Playgroud)
代码隐藏
public DeleteData DeleteDataDelegate;
public RetrieveData PopulateDataDelegate;
public delegate ArrayList RetrieveData();
public delegate void DeleteData(String sData);
protected void Page_Load(object sender, EventArgs e)
{
//load the initial data..
if (!Page.IsPostBack)
{
if (PopulateDataDelegate != null)
{
this.DataRepeater.DataSource = this.PopulateDataDelegate();
this.DataRepeater.DataBind();
}
}
}
protected void DataRepeater_ItemCommand(object source, RepeaterCommandEventArgs e)
{
if (e.CommandName == "Delete")
{
if (DeleteDataDelegate != null)
{
DeleteDataDelegate((String)e.CommandArgument);
BindDataToRepeater();
}
}
else if (e.CommandName == "Run")
{
String sRunning = (String)e.CommandArgument;
this.ViewDataModalPopupExtender.Hide();
}
}
protected void DataRepeater_ItemDataBound(object source, RepeaterItemEventArgs e)
{
RepeaterItem item = e.Item;
if (item != null && item.DataItem != null)
{
MyDTO oQuery = (MyDTO)item.DataItem;
ImageButton oDeleteControl = (ImageButton) item.FindControl("DeleteData");
ImageButton oRunControl = (ImageButton)item.FindControl("RunData");
if (oDeleteControl != null && oRunControl !=null)
{
oRunControl.ImageUrl = "button_expand.gif";
oRunControl.CommandArgument = "MyID";
if (oQuery !=null)
{
//do something
}
oDeleteControl.ImageUrl = "btn_remove.gif";
oDeleteControl.CommandArgument = "MyID";
}
}
}
public void BindDataToRepeater()
{
this.DataRepeater.DataSource = this.PopulateDataDelegate();
this.DataRepeater.DataBind();
}
public void ShowModal(object sender, EventArgs e)
{
BindDataToRepeater();
this.ViewDataModalPopupExtender.Show();
}
Run Code Online (Sandbox Code Playgroud)
感谢您提醒我为什么我停止使用ASP.NET控件.这是噩梦的确切类型,使得太多项目超出预算和时间表.
我建议你考虑实现这个的最简单方法.您可以尝试向后弯曲以使其以ASP.NET方式工作或采用最短路径.你所做的只是生成HTML,它应该永远不会那么困难.
导致问题的最可能原因是ViewState存储在页面中,该页面未在部分回发上更新.因此,对于更新面板中的每个更改,您都将回发页面的初始视图状态.
尝试用简单的for循环替换转发器(并忽略开始抱怨你的人不应该混合标记和代码).用你的数据绑定语句替换<%= %>.这样可以一起消除视图状态,并且应该删除重新出现的任何已删除的行.
| 归档时间: |
|
| 查看次数: |
6238 次 |
| 最近记录: |