在用户控件中,我在UpdatePanel (在ModalPopupExtender中显示id )中有一个Repeater。Repeater使用MyDTO对象的数组列表进行数据库。列表中的每个项目都有两个按钮。绑定后,将设置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>代码隐藏
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();
}发布于 2010-06-12 07:56:58
谢谢您提醒我为什么停止使用ASP.NET控件。这正是让太多项目超出预算和时间表的噩梦。
我给你的建议是想出最简单的方法来实现这一点。你可以试着向后弯,以便让它以ASP.NET的方式工作,或者采取最短的路线。你所做的只是生成HTML,它应该不会那么困难。
造成问题的最可能原因是ViewState存储在页面中,该页面不会在部分回发时得到更新。因此,每次更新面板中的更改,您都会回发页面的初始视图状态。
尝试用一个简单的for-循环替换中继器(忽略那些开始抱怨你不应该混合标记和代码的人)。用<%= %>替换绑定语句。这消除了所有视图状态,并应删除任何删除的行从重新出现。
发布于 2010-06-11 15:04:31
经过了很多天的混乱,我还没有找到一个合适的解决办法,但确实有一个可行的解决办法。
CollapsiblePanelExtender设置为不自动回发,这解决了扩展程序打开时重新出现已删除数据的问题。另一个问题,我相信是有关系的。
看起来,Repeater的ViewState与数据不同步。e.CommandArgument并不总是正确的,似乎引用了以前的数据。我尝试通过在打开Modal对话框时将ArrayList of MyDTO对象存储在ViewState中并使用从e.Item.ItemIndex检索的ID来找到要删除的正确元素来修复它。这没有正确地工作,ArrayList脱离ViewState是不同步的。
将ArrayList存储在会话中使其工作起来,这使我相信我做了一些根本错误的事情,或者在我正在使用的工具箱版本中有一个微妙的错误(我们仍然在使用VS2005,所以只能使用旧版本的工具包)
抱歉,如果这没有任何意义,如果你想要澄清任何事情,请与我联系。
发布于 2012-01-19 08:32:59
试着使用
((IDataItemContainer)容器).DataItem
而不是"Container.DataItem“
对我起作用了。
https://stackoverflow.com/questions/3008644
复制相似问题