list里面数据,多行写到datagridview 一格里面,现在只能写入一行

时间:2022-06-30 14:44:31
代码如下:
private void button1_Click(object sender, EventArgs e)
        {
            //第一个视图数据
            //string strtj="where 1=1 and ISNULL(fisEnd,0)=0 ";
            string strtj = "where 1=1  ";
            if (txtProjNr.Text.Length > 0)
                strtj = strtj + " and fprojNr = '" + txtProjNr.Text + "'   ";
            if (txtProjName.Text.Length > 0)
                strtj = strtj + " and fprojName = '" + txtProjName.Text + "' ";
            SqlConnection sqlcon = DataCon.datacon.getcon();
            string str = "select * from v_RscProjMd "+strtj;
            SqlCommand sqlcmd = new SqlCommand(str, sqlcon);
            SqlDataAdapter adapter = new SqlDataAdapter(sqlcmd);
            DataSet ds = new DataSet();
            adapter.Fill(ds, "v_RscProjMd");
         
            //第一个视图的数据放到数组里面
            var query = from aaa in ds.Tables["v_RscProjMd"].AsEnumerable()
                        select new
                        {
                            
                            fProjNr = aaa.Field<string>("fProjNr"),
                            fProjName = aaa.Field<string>("fProjName"),
                            fMsNr = aaa.Field<string>("MSNr"),
                            fMouldNr = aaa.Field<string>("fMouldNr"),
                            fMouldName = aaa.Field<string>("fMouldName"),
                            fPieceNr = aaa.Field<string>("fPieceNr"),
                            fpercent = aaa.Field<Int32>("fpercent"),
                            fProcName = aaa.Field<string>("fProcName"),
                            fCenterName = aaa.Field<string>("fCenterName"),
                            fSchBegdate = aaa.Field<DateTime?>("fSchbegDate"),
                            fisEnd = aaa.Field<Boolean>("fisEnd"),

                        };
         
            var list1 = query.ToList();
            
            dataGridView1.DataSource = list1;
            if (list1.Count() == 0)
            {
                MessageBox.Show("没有符合条件的数据,请重新设置查询条件!");
                return;
            }

            ////创建DataTable
            System.Data.DataTable table = new System.Data.DataTable();
            string[] fProjNr = list1.Select(t => t.fProjNr).ToArray();
            string[] fProjName = list1.Select(t => t.fProjName).ToArray();
            string[] fMouldNr = list1.Select(t => t.fMouldNr).Distinct().ToArray();
            string[] fMouldName = list1.Select(t => t.fMouldName).ToArray();
            string[] fProcName = list1.Select(t => t.fProcName).Distinct().ToArray();
            string[] fMsNr = list1.Select(t => t.fMsNr).Distinct().ToArray();
            string[] fPieceNr = list1.Select(t => t.fPieceNr).Distinct().ToArray();
            string[] fPCenterName = list1.Select(t => t.fCenterName).Distinct().ToArray();
            //string[] fSchBegdate = list1.Select(t => t.fSchBegdate).Distinct().ToArray().ToString();
            bool[] fisEnd = list1.Select(t => t.fisEnd).Distinct().ToArray();
           // fProcName.OrderBy(t => { return t.fSchBegdate; });
            ////表中第一行第一列交叉处一般显示为第1列标题
            table.Columns.Add(new DataColumn("項目編號"));
            ////表中第一行第二列交叉处一般显示为第2列标题
            table.Columns.Add(new DataColumn("項目名稱"));
            //表中第一行第三列交叉处一般显示为第3列标题
            table.Columns.Add(new DataColumn("MS單號"));

            table.Columns.Add(new DataColumn("模具編號"));

            table.Columns.Add(new DataColumn("模具名稱"));

            //中间活动数据标题,以工艺数为准   我这里如果想要以fschbegdate排序,应该怎么写
            for (int i = 0; i < fProcName.Length; i++)
            {
                DataColumn column = new DataColumn(fProcName[i]);
                table.Columns.Add(column);
            }


            //为表中各行生成数据
            for (int j = 0; j < fMsNr.Length; j++)//i为模具编号总数
            {
                  //每行第0列为行分组关键字
                    var row = table.NewRow();
                    row[0] = fProjNr[j];
                    row[1] = fProjName[j];
                    row[2] = fMsNr[j];
                    row[3] = fMouldNr[j];
                    row[4] = fMouldName[j];
                    
                    for (int a = 0; a < fProcName.Length; a++)
                                    
                {                
//提取符合条件的工件信息。。---问题一
                     string[] pieceNr = list1.Where(t => t.fMsNr == fMsNr[j] && t.fProcName == fProcName[a] && !t.fisEnd).Select(t => t.fPieceNr).ToArray();
                                          

                            foreach (var a1 in pieceNr)
                            {
                                row[fProcName[a]] = a1;
                       
                            }
                                             
                    }
                  table.Rows.Add(row);
                   } 
            dataGridView1.DataSource = table;           
                }          
            }
    } 

我想写入的数据,在数据库中结果如下:
list里面数据,多行写到datagridview 一格里面,现在只能写入一行

运行以上代码,只能显示一行数据,我希望将同一MS单号,工艺为“快走絲加工(委外)”的所有工件编号都显示出来。
list里面数据,多行写到datagridview 一格里面,现在只能写入一行


我是新手。。。请帮忙指导。。谢谢

5 个解决方案

#1


你按照同一个主key循环判断,拼接。

#2


引用 1 楼 wyqlxy 的回复:
你按照同一个主key循环判断,拼接。


具体怎么去做的,我在数据库里面用stuff()做到了那个效果,想知道如果不在数据库操作,直接在代码里面怎么去实现。。

我以为:
  string[] pieceNr = list1.Where(t => t.fMsNr == fMsNr[j] && t.fProcName == fProcName[a] && !t.fisEnd).Select(t => t.fPieceNr).ToArray();
这个查询可以将一串值存起来,然后foreach可以出来结果,但是不行。。

#3


引用 2 楼 u011883864 的回复:
Quote: 引用 1 楼 wyqlxy 的回复:

你按照同一个主key循环判断,拼接。


具体怎么去做的,我在数据库里面用stuff()做到了那个效果,想知道如果不在数据库操作,直接在代码里面怎么去实现。。

我以为:
  string[] pieceNr = list1.Where(t => t.fMsNr == fMsNr[j] && t.fProcName == fProcName[a] && !t.fisEnd).Select(t => t.fPieceNr).ToArray();
这个查询可以将一串值存起来,然后foreach可以出来结果,但是不行。。



你现在 string[] pieceNr 里面有值吗?
如果有值就简单多了。



string.Join(",", new string[] { "a", "a1" });


能看明白这句代码吧?
linq支持,4.0以上的donet

#5


你现在 string[] pieceNr 里面有值吗?
如果有值就简单多了。



string.Join(",", new string[] { "a", "a1" });


能看明白这句代码吧?
linq支持,4.0以上的donet

看上去好像可以用这个。。。去研究一下先。。。。

#1


你按照同一个主key循环判断,拼接。

#2


引用 1 楼 wyqlxy 的回复:
你按照同一个主key循环判断,拼接。


具体怎么去做的,我在数据库里面用stuff()做到了那个效果,想知道如果不在数据库操作,直接在代码里面怎么去实现。。

我以为:
  string[] pieceNr = list1.Where(t => t.fMsNr == fMsNr[j] && t.fProcName == fProcName[a] && !t.fisEnd).Select(t => t.fPieceNr).ToArray();
这个查询可以将一串值存起来,然后foreach可以出来结果,但是不行。。

#3


引用 2 楼 u011883864 的回复:
Quote: 引用 1 楼 wyqlxy 的回复:

你按照同一个主key循环判断,拼接。


具体怎么去做的,我在数据库里面用stuff()做到了那个效果,想知道如果不在数据库操作,直接在代码里面怎么去实现。。

我以为:
  string[] pieceNr = list1.Where(t => t.fMsNr == fMsNr[j] && t.fProcName == fProcName[a] && !t.fisEnd).Select(t => t.fPieceNr).ToArray();
这个查询可以将一串值存起来,然后foreach可以出来结果,但是不行。。



你现在 string[] pieceNr 里面有值吗?
如果有值就简单多了。



string.Join(",", new string[] { "a", "a1" });


能看明白这句代码吧?
linq支持,4.0以上的donet

#4


#5


你现在 string[] pieceNr 里面有值吗?
如果有值就简单多了。



string.Join(",", new string[] { "a", "a1" });


能看明白这句代码吧?
linq支持,4.0以上的donet

看上去好像可以用这个。。。去研究一下先。。。。