仅在条件之后更新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)时,才应该立即更新所有行。

如果有人能分享一些内幕,那将非常感谢

仅在条件之后更新ASP:LISTVIEW中的所有行

经过多次测试,我找到了解决问题的最佳方案。基本上,解决方案就在我眼前,但直到现在我才看到它。

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
}

最后,是一个相当简单的事情,但我花了一段时间才意识到这一点。