UWP C#:多选ListBox项存入二维数组传至下一页后仅显示首项问题
问题分析与解决方案
看起来你遇到的核心问题大概率是数组赋值时没有正确递增索引,也有可能是ListBox的多选模式没开启,导致实际只选中了一项。咱们一步步来排查和解决:
首先排查最可能的错误:索引未递增
从你给出的代码片段看,你定义了int x = 0;作为数组的行索引,但如果在遍历选中项时没有手动递增x,那每次赋值都会覆盖orderItems[0, ...]的位置,最终数组里只会保留最后一次赋值的内容(或者你以为选了两项,但实际只存了第一项)。
给你一个修正后的代码示例:
public sealed partial class foodMenu : Page { int x = 0; order n = new order(); // 假设这是你处理选中项并跳转的方法 private void ConfirmSelection() { // 先确保ListBox开启了多选!这一步很容易被忽略 listBox.SelectionMode = SelectionMode.Multiple; // 也可以用SelectionMode.Extended支持按住多选 // 遍历所有选中的项 foreach (var selectedItem in listBox.SelectedItems) { // 假设每个选中项是自定义的Food类,根据你的实际数据类型调整强转逻辑 Food foodItem = selectedItem as Food; if (foodItem != null && x < 3) // 避免超出你定义的3行数组上限 { n.orderItems[x, 0] = foodItem.Name; n.orderItems[x, 1] = foodItem.Price.ToString(); n.orderItems[x, 2] = foodItem.Category; x++; // 关键!每次赋值后必须递增索引,不然会覆盖之前的项 } } // 传递数组到下一页,这里用Frame导航为例 Frame.Navigate(typeof(OrderDetailPage), n); } }
其次检查第二页的显示逻辑
如果数组已经正确传递,但第二页只显示第一项,那可能是你在第二页只读取了数组的第一行(索引0),没有循环遍历所有行。第二页的显示代码应该这样写:
protected override void OnNavigatedTo(NavigationEventArgs e) { base.OnNavigatedTo(e); if (e.Parameter is order userOrder) { // 遍历数组的每一行,显示所有选中的项 for (int i = 0; i < 3; i++) { // 跳过空行(如果选中项不足3个) if (string.IsNullOrEmpty(userOrder.orderItems[i, 0])) break; // 示例:把信息添加到ListBox展示 orderListBox.Items.Add($"菜品:{userOrder.orderItems[i, 0]},价格:{userOrder.orderItems[i, 1]}"); } } }
额外建议:用更灵活的集合替代二维数组
其实二维数组对于动态的订单项来说不太灵活(比如用户选超过3项就会越界),更推荐用List<T>来存储,比如定义一个简单的实体类,或者直接用List<string[]>,这样可以自动扩展容量:
// 重构你的order类 public class Order { // 用List存储每个订单项的信息,无需固定行数 public List<string[]> OrderItems { get; set; } = new List<string[]>(); } // 第一页赋值代码 private void ConfirmSelection() { Order userOrder = new Order(); foreach (var selectedItem in listBox.SelectedItems) { Food foodItem = selectedItem as Food; if (foodItem != null) { string[] itemInfo = new string[] { foodItem.Name, foodItem.Price.ToString(), foodItem.Category }; userOrder.OrderItems.Add(itemInfo); } } Frame.Navigate(typeof(OrderDetailPage), userOrder); } // 第二页显示代码 protected override void OnNavigatedTo(NavigationEventArgs e) { base.OnNavigatedTo(e); if (e.Parameter is Order userOrder) { foreach (var item in userOrder.OrderItems) { orderListBox.Items.Add($"菜品:{item[0]},价格:{item[1]}"); } } }
这样不仅避免了数组越界的问题,代码也更简洁易读。
内容的提问来源于stack exchange,提问作者CoreyC
相关产品推荐
相关产品推荐

