在列表中编辑一行后保持项目位置...我应该尝试吗?

时间:2011-10-27 18:50:43

标签: asp.net listview user-interface

我手动将ASP.NET ListView绑定到按名称按字母顺序排序的对象数组。编辑项目后,再次设置DataSource并调用DataBind。如果名称发生变化,您刚编辑的项目可能已移动,甚至可能移动到另一页面。

例如;你刚刚将Hot Dog重命名为Sausage,所以Sausage在ItemUpdating完成后移动了。

--- OLD LIST ---   --- NEW LIST ---
    Hamburger          Hamburger
    Hot Dog______      Pizza
    Pizza        |_____Sausage

您希望从表单中获得这种行为吗?编辑行时,您是否希望在保存后看到该行?它应该在完全相同的位置吗?我应该在保存后仅显示 您刚编辑的记录吗?

关于保存后维护先前订单的技术方面,并且可能更改订单;

我知道为什么这种情况正在发生。我正在寻找避免它的想法。

我正考虑放弃将EditItemTemplate的控件组合到ItemTemplate中,并根据ListView EditIndex设置只读/可编辑控件的可见性。

这似乎是可行的,但我想知道你是不是很好的人有任何其他的想法。

3 个答案:

答案 0 :(得分:2)

您在此处看到的行为是典型的所需输出,因为一旦您进行了更改,信息就会被正确排序。如果您需要保留旧结构,那么您很可能必须采用类似于您在帖子中提到的路线。

但是,我会花一点时间看看这是否真的是你的用户想要的东西,我可以看到这在大量编辑后变得非常混乱。

答案 1 :(得分:1)

当我的用户使用GridView中的数据集时,我总是按数据库ID对数据进行排序,以确保每个数据项的位置保持不变。在不知道您的数据源是什么样的情况下,很难说您是否可以避免或改变重新排序。

但是,如果您在会话中保存了原始数据源,那么( 这是纯猜测,因为我不知道您正在使用哪种数据 ) (我假设您要回到数据库并在提交后抓取数据),并且它有某种有序的标识符,那么您可以执行以下操作:

void ItemUpdating(object sender, ListViewUpdateEventArgs e)
{
    List<MyClass> foodDataSource = Session["dataSource"];
    ListItem editedFoodItem = foodListView.Items[e.ItemIndex];

    MyFood newFood = new MyFood(
        ((HiddenField)editedFoodItem.FindControl("foodId")).Value,
        ((Label)editedFoodItem.FindControl("foodName")).Text
    );

    foodDataSource.Where(k => k.foodId == newFood.foodId).foodName = newFood.foodName;

    // I'm guessing that you'll save somewhere in here,
    // rather than do an update-once-style commit to the database when the user clicks a save button.

    foodListView.DataSource = foodDataSource;
    foodListView.DataBind();
}

这假设您已对ItemTemplate进行了硬编码,以包含特定的WebControls / HtmlControls。这很笨重,而且需要对这段代码进行重构,以便在单独的函数中隔离令人讨厌的代码,例如FindControl调用,但这与我在用户GridView中更新数据时所做的非常接近将他们的更改保存到数据库中。

或者,您可以保持当前的保存方法不变,只需添加以下内容:

void ItemUpdating(object sender, ListViewUpdateEventArgs e)
{
    ListItem editedFoodItem = foodListView.Items[e.ItemIndex];
    Label foodNameLabel = ((Label)editedFoodItem.FindControl("foodName"));

    foodNameLabel.BackColor = System.Drawing.Color.LightGreen;

    // Saving in here, somewhere.

    // I'm not totally positive that DisplayIndex is the correct property here.
    foodListView.Items.Where(k => k.DisplayIndex != e.ItemIndex).BackColor = System.Drawing.Color.White;
}

我不确定你的用户是否会理解UI提示,或者如果它消失了它是否会帮助他们(这会让你的生活变得更加复杂),但我认为这不如说是笨重只要您在每次编辑后将更改保存到数据库,就可以使用上面的选项。

答案 2 :(得分:0)

在某些情况下,我可以看到不需要使用列表并将项目留在原处。虽然我们程序员了解发生了什么,但普通用户可能会认为他们的项目已被删除。

我已经整理了一个展示此行为的示例网站。它实际上非常简单,我相信你可以为我的项目调整我的方法。

在一个坚果shell中,每次绑定网格时,我都会按照用户的选择(或默认排序)对数据列表进行排序,但在将其绑定到网格之前,我会检查是否应保留该顺序,在这种情况下,我从网格的DataKeyArray中提取最后一个序列号,并将这些序列号与它们各自的项相关联。在他们不想保留订单的情况下,我只是将增量序列号与排序列表中的每个项相关联。然后我只按序列号排序。

看看project,我认为这会更有意义。