gpt4 book ai didi

asp.net - UpdatePanel、Repeater、DataBinding 问题

转载 作者:行者123 更新时间:2023-12-04 17:41:28 24 4
gpt4 key购买 nike

在用户控件中,我在 UpdatePanel 内有一个 Repeater(其 ID 显示在 ModalPopupExtender 内。Repeater 使用 MyDTO 对象的数组列表进行数据绑定(bind)。列表中的每个 Item 都有两个按钮。绑定(bind)后ImageURL 和 CommandArgument 已设置。

此代码第一次运行良好,但此后 CommandArgument 错误。似乎显示已正确更新,但 DTO 未正确更新,并且发送的 CommandArgument 是刚刚删除的。

任何人都可以发现代码的任何问题吗?

编辑:我刚刚在代码中添加了一个 CollapsiblePanelExtender。当我现在删除一个项目并展开面板时,之前删除(并从显示中消失)的项目又回来了。似乎中继器没有在引擎盖下正确重建。

澳交所

<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>&nbsp;</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();
}

最佳答案

感谢您提醒我为什么停止使用 ASP.NET 控件。这正是使太多项目超出预算和进度的噩梦的确切类型。

我对您的建议是考虑实现这一点的最简单方法。您可以尝试向后弯腰,以使其以 ASP.NET 方式工作或采用最短路线。
您所做的只是生成 HTML,它应该永远不会那么困难。

问题的最可能原因是 ViewState 存储在未在部分回发时更新的页面中。因此,随着更新面板中的每次更改,您都会回发页面的初始 View 状态。

尝试用一个简单的 for 循环替换中继器(忽略那些开始提示你不应该混合标记和代码的人)。将您的数据绑定(bind)语句替换为 <%= %> .
这消除了所有的 View 状态,并且应该从重新出现中删除任何已删除的行。

关于asp.net - UpdatePanel、Repeater、DataBinding 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3008644/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com