一个动态生成DataTable的问题(帮我解决的我会再给你一百分)

时间:2021-07-15 04:50:16
先看一下我的效果图,跟数据库设计吧;

我要做出来的效果图: 一个动态生成DataTable的问题(帮我解决的我会再给你一百分)

大小编号跟产品数量关联,价格字段就在这里面

一个动态生成DataTable的问题(帮我解决的我会再给你一百分)



我要能生成一张行,列都是可以动态了!比如我增加产品数量时,表格列自动增长一个;增加大小编号时;行自动增加一行;

现在动态生成DataTable可以实现!但我不知要怎么写出来!如果有其它比较好的方法也可以提出来啊!...

假如你帮我解决的;我这号还有一百分到时我想办法也给你;

33 个解决方案

#1


你不是说已经实现动态生成datatable了么。。。
无非就是读取数据

#2


现在动态生成DataTable可以实现!但我不知要怎么写出来!

我是说要怎么动态生成DataTable;   因为我知道动态生成DataTable就可以实现这个功能啊;

不好意思啊我没说明白啊;

#3


编辑问题:
我要能生成一张行,列都是可以动态了!比如我增加产品数量时,表格列自动增长一个;增加大小编号时;行自动增加一行;

现在我要怎么动态生成DataTable!!如果有其它比较好的方法也可以提出来啊!...

假如你帮我解决的;我这号还有一百分到时我想办法也给你;

#4


该回复于2011-01-04 16:42:25被版主删除

#5



增加一列
 DataTable td = new DataTable();
td.Columns.Add("列名");
如有数据
 for (int i = 0; i < td.Rows.Count; i++)
{
     td.Rows[i]["列名"]="数据";
}
增加一行
int cou=td.Rows.Count;
for(int i=0;i<td.Columns.Count; i++)
td.Rows[cou][i]="数据";

#6


引用 5 楼 dbacv232kwe 的回复:
增加一列
 DataTable td = new DataTable();
td.Columns.Add("列名");
如有数据
 for (int i = 0; i < td.Rows.Count; i++)
{
  td.Rows[i]["列名"]="数据";
}
增加一行
int cou=td.Rows.Count;
for(int i=0;i<td.Columns.Co……

ding

#7


大家快帮帮忙!怎么实现啊!中间那些数据也要填上去啊

#8


sql 实现行转列
http://topic.csdn.net/u/20101108/20/4d7bb842-033b-4546-b71a-69b7bc23e4ec.html

#9


用临时表 可以么???

#10


这是哥不久前写的
第一列有自增效果
DataTable MyTable = new DataTable();
                DataColumn dc = MyTable.Columns.Add("Index", Type.GetType("System.Int32"));
                dc.AllowDBNull = false;
                dc.AutoIncrement = true;
                dc.AutoIncrementSeed = 1;
                dc.AutoIncrementStep = 1;
                MyTable.Columns.Add("StartCity", Type.GetType("System.String"));
                MyTable.Columns.Add("EndCity", Type.GetType("System.String"));
                MyTable.Columns.Add("MinCost", Type.GetType("System.String"));
                MyTable.Columns.Add("DtdDeadLine1", Type.GetType("System.String"));
                MyTable.Columns.Add("DtdDeadLine2", Type.GetType("System.String"));
                MyTable.Columns.Add("DtdDeadLine3", Type.GetType("System.String"));
                MyTable.Columns.Add("DtdDeadLine4", Type.GetType("System.String"));
                MyTable.Columns.Add("DtdDeadLine5", Type.GetType("System.String"));
                MyTable.Columns.Add("DtdDeadLine6", Type.GetType("System.String"));
                MyTable.Columns.Add("DtdDeadLine7", Type.GetType("System.String"));
                MyTable.Columns.Add("DtdDeadLine8", Type.GetType("System.String"));
                MyTable.Columns.Add("DtdDeadLine9", Type.GetType("System.String"));
                MyTable.Columns.Add("DtdDeadLine10", Type.GetType("System.String"));
                MyTable.Columns.Add("DtdDeadLine11", Type.GetType("System.String"));
                MyTable.Columns.Add("DtdDeadLine12", Type.GetType("System.String"));
                MyTable.Columns.Add("Memo", Type.GetType("System.String"));
                Session["tableAirItemPriceMain"] = MyTable;
                GVAirItemPriceMain.DataSource = MyTable;
                GVAirItemPriceMain.DataBind();

#11


该回复于2011-01-05 09:05:55被版主删除

#12


这个就如动态统计表一样,先做列表头,再做行表头,最后,利用行和列去查询就是了

#13


dataTable 添加列再
DataRow dr=Dt.NewRow();
dr[""]="";
....
dt.rows.Add(dr);

#14


我在线等呢大家都来看看啊!

#15


这样可以实现
 protected void Page_Load(object sender, EventArgs e)
    {
        //读取出表T_PhotoNum表中记录到表 tbPhotoNum
        //读取出表T_Paintsize数据到表 tbPaintSize
        //读取出表T_Photo_Size数据到表 tbPhotoSize
        //传参 tbPhotoNum.rows.count 动态生成临时表
        DataTable tb = this.GetTb(5);
        DataRow tr;

        //先生成首行,列名
        tr = tb.NewRow();
        tr["PhotoSize"] = "Size";
        for (int k = 0; k < tbPhotoNum.Rows.count; k++)
        {
            int p = k + 1;
            tr["Col" + p.ToString()] = tbPhotoNum.Rows[k]["PhotoNum"].tostring();
        }
        tr = tb.Rows.Add(tr);
        //下面是绑定数据
        for (int i = 0; i < tbPaintSize.rows.count; i++)//外循环Paintsize
        {
            tr = tb.NewRow();
            tr["PhotoSize"] = tbPaintSize.rows[i]["PaintSize"].tostring();
            for (int j = 0; j < tbPhotoNum.Rows.count; j++)//内循环PhotoNum
            {
                int p = j + 1;
                DataRow [] findR=tbPhotoSize.select("SizeID="+Convert.ToInt32( tbPaintSize.rows[i]["Id"].tostring())
                                +" and Photoid="+Convert.ToInt32( tbPhotoNum.rows[i]["Id"].tostring()));
                if (findR.Length > 0)
                {
                    tr["Col" + p.ToString()] = findR[0]["PhotoPrice"].ToString();
                }
                else
                {
                    tr["Col" + p.ToString()] = "";
                }
                tb.Rows.Add(tr);
            }
        }

        //将tb值绑定到gridview
        this.GridView1.DataSource = tb;
        this.GridView1.DataBind();
        this.GridView1.HeaderRow.Visible = false;//标题行生成,原来遍体行要隐藏
    }

    private DataTable GetTb(int N)
    {
        DataTable tb = new DataTable();
        DataColumn col;

        col = new DataColumn();
        col.DataType = System.Type.GetType("System.String");
        col.ColumnName = "PhotoSize";
        tb.Columns.Add(col);

        for(int i=1;i<=N;i++)
        {
            col = new DataColumn();
            col.DataType = System.Type.GetType("System.String");
            col.ColumnName = "COL" + i.ToString();
            tb.Columns.Add(col);
        }

        return tb;
    }

#16


上面 DataTable tb = this.GetTb(5);
这里应该是这样
DataTable tb = this.GetTb(tbPhotoNum.rows.count );

#17


该回复于2011-01-05 08:47:58被版主删除

#18


又发现点错误

绑定数据的tb.Rows.Add(tr);应移除内循环,因为只有绑定了一行值之后再填入表
改成如下
 //下面是绑定数据
        for (int i = 0; i < tbPaintSize.rows.count; i++)//外循环Paintsize
        {
            tr = tb.NewRow();
            tr["PhotoSize"] = tbPaintSize.rows[i]["PaintSize"].tostring();
            for (int j = 0; j < tbPhotoNum.Rows.count; j++)//内循环PhotoNum
            {
                int p = j + 1;
                DataRow [] findR=tbPhotoSize.select("SizeID="+Convert.ToInt32( tbPaintSize.rows[i]["Id"].tostring())
                                +" and Photoid="+Convert.ToInt32( tbPhotoNum.rows[i]["Id"].tostring()));
                if (findR.Length > 0)
                {
                    tr["Col" + p.ToString()] = findR[0]["PhotoPrice"].ToString();
                }
                else
                {
                    tr["Col" + p.ToString()] = "";
                }
            }
            tb.Rows.Add(tr);//绑定了一行值之后再填入表
        }

#19


用sql语句进行行列转换,应该能实现

#20


使用数据库数据类型 xml,这种数据类型较灵活,不需要动态字段

#21


用 Repeater 实现。

#22


<asp:Repeater>
    <th>绑定列</th>
</asp:Repeater>
<asp:Repeater>
     Size(行)
</asp:Repeater>

#23


我觉得直接在代码中拼凑datatable更容易些,我们有些统计表都是这么实现的。。。
先生成一个datatable里面存放的是列名,从T_photoNum中取值,再生成一个表里面存放的是行名,在T_Paintsize中取值,然后把列名的表转成列,最后利用行和列为条件在表T_photo_size中取值显示就可以了。。。

#24


DataTable Columns Row

#25


高手们快来吧

#26


这个可以 类似的我也做过
引用 5 楼 dbacv232kwe 的回复:
增加一列
 DataTable td = new DataTable();
td.Columns.Add("列名");
如有数据
 for (int i = 0; i < td.Rows.Count; i++)
{
  td.Rows[i]["列名"]="数据";
}
增加一行
int cou=td.Rows.Count;
for(int i=0;i<td.Columns.Co……

#27


静等高手啊

#28


还是不死心啊!等等高手的出现啊

#29


没有试过用sql语句吗?

#30


不好意思 我先问你个问题,
你的行是根据产品编号表来的,那这样的话 通过大小编号跟产品数量关联表 得到关系后
每个产品编号 对应的数量 是否都一样呢?
举例一下:如第一行 对应的产品数量是10 
第2行 对应的产品量是15  那你这个动态表要多难看的。。1行有11列 2行16列。

如果你的产品数量是固定的 所有编号的都相同 那就很好拼sql了 

否则得话 最笨的办法就是存储过程内用循环做
最好不要页面去操作内存的table 效率低不说 赋值的话不方便 

#31


而且我看你这个界面很别扭,列根据产品数量生成,即数字的数量为列数。
这样的话 你关系表获得价格的时候所有动态列的值都相同 这样一个界面很难理解为什么这么设计,
如果是单纯的做展示的话 你可以放一个隐藏层去做 当鼠标移上去,可以根据在当前位置 把它的明细显示出来,而不用动态列去做,如果你这个数量上百的话 页面怎么显示呢?
希望楼主解答下吧。看看能不能一起想个办法解决。

#32


单纯实现动态行列的话  只要你列数固定的话好做 给你个列子 
例如你的表内产品数量为10
拼sql:
1.查询产品数量表得到10并赋给一个变量
2.定义一个字符串:string sSQl="select 产品编号 ";
for(int i=1;i<=产品数量变量;i++)
{
   sSQL +=",产品价格 as "+i+"Figures ";
}
sSQL +=" from 大小编号表 left join 关联表 on 关联表.编号表ID=大小编号表.ID ";

执行sql
获得table;

#33


该回复于2011-01-07 11:27:17被版主删除

#1


你不是说已经实现动态生成datatable了么。。。
无非就是读取数据

#2


现在动态生成DataTable可以实现!但我不知要怎么写出来!

我是说要怎么动态生成DataTable;   因为我知道动态生成DataTable就可以实现这个功能啊;

不好意思啊我没说明白啊;

#3


编辑问题:
我要能生成一张行,列都是可以动态了!比如我增加产品数量时,表格列自动增长一个;增加大小编号时;行自动增加一行;

现在我要怎么动态生成DataTable!!如果有其它比较好的方法也可以提出来啊!...

假如你帮我解决的;我这号还有一百分到时我想办法也给你;

#4


该回复于2011-01-04 16:42:25被版主删除

#5



增加一列
 DataTable td = new DataTable();
td.Columns.Add("列名");
如有数据
 for (int i = 0; i < td.Rows.Count; i++)
{
     td.Rows[i]["列名"]="数据";
}
增加一行
int cou=td.Rows.Count;
for(int i=0;i<td.Columns.Count; i++)
td.Rows[cou][i]="数据";

#6


引用 5 楼 dbacv232kwe 的回复:
增加一列
 DataTable td = new DataTable();
td.Columns.Add("列名");
如有数据
 for (int i = 0; i < td.Rows.Count; i++)
{
  td.Rows[i]["列名"]="数据";
}
增加一行
int cou=td.Rows.Count;
for(int i=0;i<td.Columns.Co……

ding

#7


大家快帮帮忙!怎么实现啊!中间那些数据也要填上去啊

#8


sql 实现行转列
http://topic.csdn.net/u/20101108/20/4d7bb842-033b-4546-b71a-69b7bc23e4ec.html

#9


用临时表 可以么???

#10


这是哥不久前写的
第一列有自增效果
DataTable MyTable = new DataTable();
                DataColumn dc = MyTable.Columns.Add("Index", Type.GetType("System.Int32"));
                dc.AllowDBNull = false;
                dc.AutoIncrement = true;
                dc.AutoIncrementSeed = 1;
                dc.AutoIncrementStep = 1;
                MyTable.Columns.Add("StartCity", Type.GetType("System.String"));
                MyTable.Columns.Add("EndCity", Type.GetType("System.String"));
                MyTable.Columns.Add("MinCost", Type.GetType("System.String"));
                MyTable.Columns.Add("DtdDeadLine1", Type.GetType("System.String"));
                MyTable.Columns.Add("DtdDeadLine2", Type.GetType("System.String"));
                MyTable.Columns.Add("DtdDeadLine3", Type.GetType("System.String"));
                MyTable.Columns.Add("DtdDeadLine4", Type.GetType("System.String"));
                MyTable.Columns.Add("DtdDeadLine5", Type.GetType("System.String"));
                MyTable.Columns.Add("DtdDeadLine6", Type.GetType("System.String"));
                MyTable.Columns.Add("DtdDeadLine7", Type.GetType("System.String"));
                MyTable.Columns.Add("DtdDeadLine8", Type.GetType("System.String"));
                MyTable.Columns.Add("DtdDeadLine9", Type.GetType("System.String"));
                MyTable.Columns.Add("DtdDeadLine10", Type.GetType("System.String"));
                MyTable.Columns.Add("DtdDeadLine11", Type.GetType("System.String"));
                MyTable.Columns.Add("DtdDeadLine12", Type.GetType("System.String"));
                MyTable.Columns.Add("Memo", Type.GetType("System.String"));
                Session["tableAirItemPriceMain"] = MyTable;
                GVAirItemPriceMain.DataSource = MyTable;
                GVAirItemPriceMain.DataBind();

#11


该回复于2011-01-05 09:05:55被版主删除

#12


这个就如动态统计表一样,先做列表头,再做行表头,最后,利用行和列去查询就是了

#13


dataTable 添加列再
DataRow dr=Dt.NewRow();
dr[""]="";
....
dt.rows.Add(dr);

#14


我在线等呢大家都来看看啊!

#15


这样可以实现
 protected void Page_Load(object sender, EventArgs e)
    {
        //读取出表T_PhotoNum表中记录到表 tbPhotoNum
        //读取出表T_Paintsize数据到表 tbPaintSize
        //读取出表T_Photo_Size数据到表 tbPhotoSize
        //传参 tbPhotoNum.rows.count 动态生成临时表
        DataTable tb = this.GetTb(5);
        DataRow tr;

        //先生成首行,列名
        tr = tb.NewRow();
        tr["PhotoSize"] = "Size";
        for (int k = 0; k < tbPhotoNum.Rows.count; k++)
        {
            int p = k + 1;
            tr["Col" + p.ToString()] = tbPhotoNum.Rows[k]["PhotoNum"].tostring();
        }
        tr = tb.Rows.Add(tr);
        //下面是绑定数据
        for (int i = 0; i < tbPaintSize.rows.count; i++)//外循环Paintsize
        {
            tr = tb.NewRow();
            tr["PhotoSize"] = tbPaintSize.rows[i]["PaintSize"].tostring();
            for (int j = 0; j < tbPhotoNum.Rows.count; j++)//内循环PhotoNum
            {
                int p = j + 1;
                DataRow [] findR=tbPhotoSize.select("SizeID="+Convert.ToInt32( tbPaintSize.rows[i]["Id"].tostring())
                                +" and Photoid="+Convert.ToInt32( tbPhotoNum.rows[i]["Id"].tostring()));
                if (findR.Length > 0)
                {
                    tr["Col" + p.ToString()] = findR[0]["PhotoPrice"].ToString();
                }
                else
                {
                    tr["Col" + p.ToString()] = "";
                }
                tb.Rows.Add(tr);
            }
        }

        //将tb值绑定到gridview
        this.GridView1.DataSource = tb;
        this.GridView1.DataBind();
        this.GridView1.HeaderRow.Visible = false;//标题行生成,原来遍体行要隐藏
    }

    private DataTable GetTb(int N)
    {
        DataTable tb = new DataTable();
        DataColumn col;

        col = new DataColumn();
        col.DataType = System.Type.GetType("System.String");
        col.ColumnName = "PhotoSize";
        tb.Columns.Add(col);

        for(int i=1;i<=N;i++)
        {
            col = new DataColumn();
            col.DataType = System.Type.GetType("System.String");
            col.ColumnName = "COL" + i.ToString();
            tb.Columns.Add(col);
        }

        return tb;
    }

#16


上面 DataTable tb = this.GetTb(5);
这里应该是这样
DataTable tb = this.GetTb(tbPhotoNum.rows.count );

#17


该回复于2011-01-05 08:47:58被版主删除

#18


又发现点错误

绑定数据的tb.Rows.Add(tr);应移除内循环,因为只有绑定了一行值之后再填入表
改成如下
 //下面是绑定数据
        for (int i = 0; i < tbPaintSize.rows.count; i++)//外循环Paintsize
        {
            tr = tb.NewRow();
            tr["PhotoSize"] = tbPaintSize.rows[i]["PaintSize"].tostring();
            for (int j = 0; j < tbPhotoNum.Rows.count; j++)//内循环PhotoNum
            {
                int p = j + 1;
                DataRow [] findR=tbPhotoSize.select("SizeID="+Convert.ToInt32( tbPaintSize.rows[i]["Id"].tostring())
                                +" and Photoid="+Convert.ToInt32( tbPhotoNum.rows[i]["Id"].tostring()));
                if (findR.Length > 0)
                {
                    tr["Col" + p.ToString()] = findR[0]["PhotoPrice"].ToString();
                }
                else
                {
                    tr["Col" + p.ToString()] = "";
                }
            }
            tb.Rows.Add(tr);//绑定了一行值之后再填入表
        }

#19


用sql语句进行行列转换,应该能实现

#20


使用数据库数据类型 xml,这种数据类型较灵活,不需要动态字段

#21


用 Repeater 实现。

#22


<asp:Repeater>
    <th>绑定列</th>
</asp:Repeater>
<asp:Repeater>
     Size(行)
</asp:Repeater>

#23


我觉得直接在代码中拼凑datatable更容易些,我们有些统计表都是这么实现的。。。
先生成一个datatable里面存放的是列名,从T_photoNum中取值,再生成一个表里面存放的是行名,在T_Paintsize中取值,然后把列名的表转成列,最后利用行和列为条件在表T_photo_size中取值显示就可以了。。。

#24


DataTable Columns Row

#25


高手们快来吧

#26


这个可以 类似的我也做过
引用 5 楼 dbacv232kwe 的回复:
增加一列
 DataTable td = new DataTable();
td.Columns.Add("列名");
如有数据
 for (int i = 0; i < td.Rows.Count; i++)
{
  td.Rows[i]["列名"]="数据";
}
增加一行
int cou=td.Rows.Count;
for(int i=0;i<td.Columns.Co……

#27


静等高手啊

#28


还是不死心啊!等等高手的出现啊

#29


没有试过用sql语句吗?

#30


不好意思 我先问你个问题,
你的行是根据产品编号表来的,那这样的话 通过大小编号跟产品数量关联表 得到关系后
每个产品编号 对应的数量 是否都一样呢?
举例一下:如第一行 对应的产品数量是10 
第2行 对应的产品量是15  那你这个动态表要多难看的。。1行有11列 2行16列。

如果你的产品数量是固定的 所有编号的都相同 那就很好拼sql了 

否则得话 最笨的办法就是存储过程内用循环做
最好不要页面去操作内存的table 效率低不说 赋值的话不方便 

#31


而且我看你这个界面很别扭,列根据产品数量生成,即数字的数量为列数。
这样的话 你关系表获得价格的时候所有动态列的值都相同 这样一个界面很难理解为什么这么设计,
如果是单纯的做展示的话 你可以放一个隐藏层去做 当鼠标移上去,可以根据在当前位置 把它的明细显示出来,而不用动态列去做,如果你这个数量上百的话 页面怎么显示呢?
希望楼主解答下吧。看看能不能一起想个办法解决。

#32


单纯实现动态行列的话  只要你列数固定的话好做 给你个列子 
例如你的表内产品数量为10
拼sql:
1.查询产品数量表得到10并赋给一个变量
2.定义一个字符串:string sSQl="select 产品编号 ";
for(int i=1;i<=产品数量变量;i++)
{
   sSQL +=",产品价格 as "+i+"Figures ";
}
sSQL +=" from 大小编号表 left join 关联表 on 关联表.编号表ID=大小编号表.ID ";

执行sql
获得table;

#33


该回复于2011-01-07 11:27:17被版主删除