将DataTable中多条记录的两列拼接显示

    订餐系统中需要将一份订单的各个菜名及其份数放到一起显示,如下图,下图也是最终想要的效果:




   


    对应到我们的数据库中,一个订单号有多条食物及其相应份数的记录。


    基本情况介绍完毕,我是这么去实现它的,概括起来:循环+拼接


    1.页面的后台代码


   

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using BLL;
using Entity;
using System.Data;
using System.Data.SqlClient;
using System.Collections;

namespace OrderSystem.Behind
{
    public partial class NotTakeOrder : System.Web.UI.Page
    {
        OrderBll orderBll = new OrderBll();
        public string FoodNameDetailOut;//食物名拼接
        public string FoodNumDetailOut;//份数拼接
        public string FoodDetail;//最后的拼接
        protected void Page_Load(object sender, EventArgs e)
        {

            //判断session里面是否存在管理员
            if (Session["admin"] != null)
            {
                //已登陆
                if (!Page.IsPostBack)
                {
                    DataTable dt3 = new DataTable();
                    dt3 = orderBll.QueryNotTakeFoodDetailOther();
                    gvFoodDetail.DataSource = dt3;//dt3用来绑定页面数据,同时“食物详情”借尸还魂,用它的"foodstate"字段,展示出来

                    //获取所有未取餐的订单号
                    DataTable dt1 = orderBll.QueryNotTakeOrder();
                    //获得一共多少个未取餐订单号
                    int len = dt1.Rows.Count;
                    //设置字符串数组是多大的
                    string[] str = new string[len];
                    for (int i = 0; i < len; i++)
                    {
                        //获取所有的订单号
                        str[i] = dt1.Rows[i]["orderid"].ToString();
                        //挨个订单号进行查询
                        DataTable dt2 = orderBll.QueryNotTakeFoodDetail(str[i]);
                        //获取该订单号下所有食物名称
                        int len2 = dt2.Rows.Count;
                        string[] str2 = new string[len2];
                        for (int j = 0; j < len2; j++)
                        {
                            FoodNameDetailOut += dt2.Rows[j]["foodName"].ToString() + "-";
                        }
                        //用完后立马清空字符串数组
                        for (int a = 0; a < str2.Length; a++)
                        {
                            str2[a] = "";
                        }

                        //获取该订单号下所有食物的份数
                        int len3 = dt2.Rows.Count;
                        string[] str3 = new string[len3];
                        for (int z = 0; z < len3; z++)
                        {
                            FoodNumDetailOut += dt2.Rows[z]["num"].ToString() + "-";
                        }
                        //用完后立马清空字符串数组
                        for (int a = 0; a < str3.Length; a++)
                        {
                            str3[a] = "";
                        }
                        string[] FoodName = FoodNameDetailOut.Split('-');
                        string[] FoodNum = FoodNumDetailOut.Split('-');

                        FoodNameDetailOut="";
                        FoodNumDetailOut="";
                        //还是获取行数
                        int len4 = dt2.Rows.Count;
                        for (int m = 0; m < len4; m++)
                        {
                            //该订单号下的所有食物及其各自数量拼接完毕
                            FoodDetail += FoodName[m] + ":" + FoodNum[m] + "份 ";

                        }

                        for (int a = 0; a < FoodName.Length; a++)
                        {
                            FoodName[a] = "";
                        }
                        for (int a = 0; a < FoodNum.Length; a++)
                        {
                            FoodNum[a] = "";
                        }

                        string[] strall = new string[len];
                        strall[i] = FoodDetail;

                        FoodDetail = "";//不然字符串越拼越多,越来越长……

                        //使用的是FoodState列,提前修改数据库该字段数据类型为nvarchar(50),即大容量字符串,以免出错
                        dt3.Rows[i]["foodState"] = strall[i];//借用datatable给框赋值
                    }
                    gvFoodDetail.DataBind();
                }
            }
        }
        //实现分页
        //protected void gvFood_PageIndexChanging(object sender, GridViewPageEventArgs e)
        //{
        //    gvFoodDetail.PageIndex = e.NewPageIndex;
        //    BindFood(); //重新绑定GridView数据的函数
        //}
        //protected void BindFood()
        //{
        //    gvFoodDetail.DataSource = orderBll.QueryNotTakeFoodDetailOther();
        //    gvFoodDetail.DataBind();
        //}

    }
}



    2.不常见的D层方法


    同一个订单号,只取一条记录



      //获取订餐详情,同一个订单号的只取一条
      public DataTable QueryNotTakeFoodDetailOther()
      {
          string cmdText = @"select s.*  
                            from ( 
                            select *, row_number() over (partition by orderid order by totalcost) as      group_idx
                            from v_OrderDetails v, t_Card c  where v.cardNo=c.cardId and v.WhetherEat='F') s
                            where s.group_idx = 1";
          return helper.ExecuteQuery(cmdText, CommandType.Text);
      }



    总结:

    1.循环的时候要注意清空用到的临时变量

    2.循环里的局部变量可以赋给全局变量将值传出来

    3.现在再看写的后台页面代码,很low,很多地方可以优化……


    学无止境,逆水行舟,继续努力!


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值