仅在条件之后更新ASP:LISTVIEW中的所有行
本文关键字:LISTVIEW 条件 之后 更新 ASP | 更新日期: 2023-09-27 18:17:51
我试图在项目的一些条件为真后更新一个asp:ListView。问题是更新发生在循环中,因此我最终添加了错误的值。
这是我的asp:listview:
Item 1 Item 2 Item 3 Item 4 ERROR
john 490 1 0 Message
peter 4 0 0 Message
veronica 2 3 1 Message
Oscar 2 0 0 Message
Caroline 1 0 0 Message
条件如下:
1.- I have a total number of 499
2.- The total number of Item 2 (sum of all rows) must match exactly 499
3.- Item 2 cannot be lower than the result of minus Item 3 with Item 4
4.- Once all the conditions are correct, the update must be done globally for all rows in the listview.
这就是我正在做的:
<asp:label id="lbl_error_outside_view" runat="server"/>
<asp:ListView ID="gv_browse" runat="server" AutoGenerateColumns="False">
...
</asp:ListView>
<asp:Button ID="btnupdate" Text="Update All" runat="server" OnClick="btnupdate_Click" />
protected void btnupdate_Click(object sender, EventArgs e)
{
int total_at = 499;
int total_global = 0;
int total_items = 0;
//Get total value for all Item2 column = total_global
foreach (ListViewItem itemRow in this.gv_browse.Items)
{
var item2 = itemRow.FindControl("tbx_item2") as TextBox;
int item2_int = Convert.ToInt32(item2.Text);
total_global = total_global + item2_int;
}
foreach (ListViewItem itemRow in this.gv_browse.Items)
{
var item1 = itemRow.FindControl("hdn_item1") as HiddenField;
var item2 = itemRow.FindControl("tbx_item2") as TextBox;
var item3 = itemRow.FindControl("lbl_item3") as Label;
var item4 = itemRow.FindControl("lbl_item4") as Label;
Label lbl_error = itemRow.FindControl("lbl_error") as Label;
int result_item3_4 = (Convert.ToInt32(item3.Text) - Convert.ToInt32(item4.Text));
int item2_int = Convert.ToInt32(item2.Text);
total_items = total_items + item2_int;
if (item2_int < result_item3_4)
{
//ERROR, DO NOT UPDATE
lbl_error.Text="...";
}
else if (item2_int >= result_item3_4)
{
lbl_error.Text = "---"; //Clear error message
}
if (total_items > total_at)
{
//ERROR, DO NOT UPDATE
lbl_error_outside_view.Text ="...";
}
else if (total_global < total_at)
{
//ERROR, DO NOT UPDATE
lbl_error_outside_view.Text="...";
}
}
我的问题是我把更新行到底放在哪里?
//Update all in the DB
UpdateData(item1, item2);
如果我在foreach中调用UpdateData方法,我最终只更新符合条件的行。我需要的是能够更新所有的行后,验证每一行是正确的吗?所有的条件都有效,尽管很可能有更好的方法。有人能看出我做错了什么吗?非常感谢。
让我来解释一下为什么foreach循环中的ELSE不起作用:
我用几个不同的行从数据库填充listview。我添加了5行作为示例。每行有3列,分别是数值item2、item3和item4列。我有一个全球号码,举个例子,我说499。所有行中item2的总和必须恰好等于这个全局数字499。如果没有,那么更新不应该发生(即错误显示在lbl_error_outside_view标签)。因此,这里是第一个条件开始的地方:"如果所有行的总数不等于全局数…"。
现在,对于第二个条件,我需要检查每一行,并确保Item2列不低于(item3 - item4)列。如果没有,那么更新也不应该发生(即错误显示在特定行的lbl_error标签中)。因为我在foreach循环中,因为我检查了两个不同的东西,item2行的总数和单独的行,我不能添加else {updateData(item1, item2);}因为那基本上只会更新条件所应用的行这不是我需要的。这就是为什么循环中的else不是解决方案。
只有当我们知道所有行中item2的总数等于499且item2中的每一行都不低于(item3-item4)时,才应该立即更新所有行。
如果有人能分享一些内幕,那将非常感谢
经过多次测试,我找到了解决问题的最佳方案。基本上,解决方案就在我眼前,但直到现在我才看到它。
foreach (ListViewItem itemRow in this.gv_browse.Items)
{
//run all the conditions here and add ONLY the correct results to a DataTable (if wrong result found, return;)
}
,然后调用datatable并在这里进行更新。
foreach (DataRow row in dt.Rows)
{
//call update method
}
最后,是一个相当简单的事情,但我花了一段时间才意识到这一点。