You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:28:20