我正在进行ASP.NET Web Forms
项目。我有Update Panel
,在此面板中,我有Repeater
,里面有几个嵌套的转发器。所以我的标记看起来像这样:
<asp:UpdatePanel ID="UpProducts"
UpdateMode="Always"
runat="server">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnAllocate"/>
</Triggers>
<ContentTemplate>
<asp:Repeater ID="RpUserNameAndProductName"
runat="server">
<ItemTemplate>
..
<asp:Repeater ID="RpProductDescription"
runat="server">
<HeaderTemplate>
//sonme data
</HeaderTemplate>
<ItemTemplate>
//some data
</ItemTemplate>
<asp:Repeater ID="AnotherRepeater"
runat="server">
<HeaderTemplate>
//sonme data
</HeaderTemplate>
<ItemTemplate>
//some data
</ItemTemplate>
</ItemTemplate>
</ContentTemplate>
</asp:UpdatePanel>
<asp:button id="btnAllocate"
text="Allocate"
usesubmitbehavior="false"
onclick="btnAllocate_Click"
runat="server"/>
有点令人困惑的标记可能但是我的想法是,当我点击btnAllocate
时,我想从嵌套转发器的某些文本框中获取值,我从数据库开始填充,然后根据它们的值计算并设置最初为空的另一个文本框的值,直到用户决定他希望系统为他进行分配。
因此,当我在代码中输入btnAllocate_Click
事件后,我有:
try
{
foreach (RepeaterItem item in RpUserNameAndProductName.Items)
{
Repeater innerRepeater = (Repeater)item.FindControl("RpProductDescription")
foreach (RepeaterItem innerItem in innerRepeater.Items)
{
//here I collect the values and calculate/set the empty text box value
TextBox txtSomeCalculatedBox = (TextBox)innerItem.FindControl("txtCalculated");
txtSomeCalculatedBox.Text = //here I execute DB query
}
Repeater anotherInnerRepeater = (Repeater)item.FindControl("AnotherRepeater")
foreach (RepeaterItem aInnerItem in anotherInnerRepeater .Items)
{
//here I collect the values and calculate/set the empty text box value
}
}
}
catch (Exception ex)
{
//How to stop the values from being updated?
}
所以基本上这就是我感到困惑的地方。为了计算新值,我需要根据我从Repeater获取的信息执行数据库查询,以便有错误的余地。但是,如果第一个foreach
进展顺利且错误从第二个或第三个引发,依此类推,则使用新计算的值更新转发器。这是合乎逻辑的,因为我在foreach中设置了值,我得到了控件。
所以我想要做的是,如果我进入catch
块(抛出一个激活)只是为了阻止更新面板部分更新面板/转发器更新信息。