订餐系统中需要将一份订单的各个菜名及其份数放到一起显示,如下图,下图也是最终想要的效果:
对应到我们的数据库中,一个订单号有多条食物及其相应份数的记录。
基本情况介绍完毕,我是这么去实现它的,概括起来:循环+拼接
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,很多地方可以优化……
学无止境,逆水行舟,继续努力!