如何在datatable中循环添加数据

时间:2022-09-21 19:12:22
比如我界面有一个表单和一个按钮,当我点击一次按钮就会提交一次表单,并且把这个表单写进一个datatable上去,如果我提交第二次表单的话就再往datatable写一条数据,这个怎么实现啊?就是要循环的在datatable添加数据。
还有,最后datatable绑定给gridview显示在界面给用户看,当我绑定给gridview后,我如何选中这个gridview中的某行呢?

这是按钮的代码:
   protected void Button3_Click(object sender, EventArgs e)
    {
        string GoodsId = TextBox1.Text;
        string Name = TextBox2.Text;
        string Locality = TextBox3.Text;
        string Unit = TextBox4.Text;
        string Guige = TextBox5.Text;
        string Price = TextBox6.Text;
        string Num = TextBox7.Text;
        string Count = TextBox8.Text;
      
        ModelAddGoods ag = new ModelAddGoods(GoodsId, Name, Locality, Unit, Guige, Price, Num, Count,i);
        GridView1.DataSource = new AddGoodsDAO().saveGoods(ag);
        GridView1.DataBind();




    }



然后这个是DAL层的代码:
        public DataTable saveGoods(ModelAddGoods ag)
        {
            int i = Convert.ToInt32(ag.ii);
            DataTable dt = new DataTable("AddGoods");
            DataColumn dc = null;
            dc = dt.Columns.Add("ID", Type.GetType("System.Int32"));
            dc.AutoIncrement = true;//自动增加
            dc.AutoIncrementSeed = 1;//起始为1
            dc.AutoIncrementStep = 1;//步长为1
            dc.AllowDBNull = false;//

            dc = dt.Columns.Add("GoodsId", Type.GetType("System.Int32"));
            dc = dt.Columns.Add("Name", Type.GetType("System.String"));
            dc = dt.Columns.Add("Locality", Type.GetType("System.String"));
            dc = dt.Columns.Add("Unit", Type.GetType("System.String"));
            dc = dt.Columns.Add("Guige", Type.GetType("System.String"));
            dc = dt.Columns.Add("Price", Type.GetType("System.Int32"));
            dc = dt.Columns.Add("Num", Type.GetType("System.Int32"));
            dc = dt.Columns.Add("Count", Type.GetType("System.Int32"));

            DataRow newRow;
            newRow = dt.NewRow();
            newRow["GoodsId"] = ag.GGoodsId;
            newRow["Name"] = ag.NName;
            newRow["Locality"] = ag.LLocality;
            newRow["Unit"] = ag.UUnit;
            newRow["Guige"] = ag.GGuige;
            newRow["Price"] = ag.PPrice;
            newRow["Num"] = ag.NNum;
            newRow["Count"] = ag.CCount;

            return dt;
            
        }

17 个解决方案

#1


DataTable dt = new DataTable("AddGoods");
放在外面就可以了
saveGoods方法每次给dt添加一行

#2


你这样的DataTable每次只能存一次提交的值

#3


你每次调用DAL的方法DataTable dt = new DataTable("AddGoods");都会重新实例化一次,每次只把当前的值放到gridview上,不会累加。
可以用viewstate保存当前的gridview的值,每次向viewstate中添加数据,然后绑定到girdview上面去。
我如何选中这个gridview中的某行呢?楼主可以添加一个        
<Columns>
            <asp:CommandField HeaderText="选择" ShowSelectButton="True" />
</Columns>
然后在SelectedIndexChanged事件中写你的操作。。。

#4


引用 1 楼 thinkingforever 的回复:
DataTable dt = new DataTable("AddGoods");
放在外面就可以了
saveGoods方法每次给dt添加一行



saveGoods方法就是每次执行都添加一行了吧?对datatable不太熟悉。。。

#5


引用 3 楼 qgqch2008 的回复:
你每次调用DAL的方法DataTable dt = new DataTable("AddGoods");都会重新实例化一次,每次只把当前的值放到gridview上,不会累加。
可以用viewstate保存当前的gridview的值,每次向viewstate中添加数据,然后绑定到girdview上面去。
我如何选中这个gridview中的某行呢?楼主可以添加一个  
<Columns>
  ……



这个viewstate怎么用呢?不知道如何用啊。。。可以举个例子不?

#6



public string Text 
{   
     get { return (string)ViewState["Text"]; }   
     set { ViewState["Text"] = value; }
}


#7


我现在把代码改成如下还是添加不了多行数据啊。。。麻烦帮我看看那里错了。。。

public partial class AddGoods : System.Web.UI.Page
{
    int i = 0;
    DataTable dt = new DataTable("AddGoods");
    
    
    protected void Page_Load(object sender, EventArgs e)
    {
        DataColumn dc = null;
        dc = dt.Columns.Add("ID", Type.GetType("System.Int32"));
        dc.AutoIncrement = true;//自动增加
        dc.AutoIncrementSeed = 1;//起始为1
        dc.AutoIncrementStep = 1;//步长为1
        dc.AllowDBNull = false;//

        dc = dt.Columns.Add("GoodsId", Type.GetType("System.Int32"));
        dc = dt.Columns.Add("Name", Type.GetType("System.String"));
        dc = dt.Columns.Add("Locality", Type.GetType("System.String"));
        dc = dt.Columns.Add("Unit", Type.GetType("System.String"));
        dc = dt.Columns.Add("Guige", Type.GetType("System.String"));
        dc = dt.Columns.Add("Price", Type.GetType("System.Int32"));
        dc = dt.Columns.Add("Num", Type.GetType("System.Int32"));
        dc = dt.Columns.Add("Count", Type.GetType("System.Int32"));

        

    }

        protected void Button3_Click(object sender, EventArgs e)
    {
        
        
        
        
        string GoodsId = TextBox1.Text;
        string Name = TextBox2.Text;
        string Locality = TextBox3.Text;
        string Unit = TextBox4.Text;
        string Guige = TextBox5.Text;
        string Price = TextBox6.Text;
        string Num = TextBox7.Text;
        string Count = TextBox8.Text;

        DataRow newRow;
        newRow = dt.NewRow();
        newRow["GoodsId"] = ag.GoodsId;
        newRow["Name"] = ag.Name;
        newRow["Locality"] = ag.Locality;
        newRow["Unit"] = ag.Unit;
        newRow["Guige"] = ag.Guige;
        newRow["Price"] = ag.Price;
        newRow["Num"] = ag.Num;
        newRow["Count"] = ag.Count;

        dt.Rows.Add(newRow);
        ViewState["dt"] = dt;

        GridView1.DataSource = (DataTable)ViewState["dt"];
        GridView1.DataBind();
        
        
   }

#8


1、写个得到数据的方法
public DataTable getDataTable()
{
//这里主要是循环gridview中的数据
将gridview中的数据添加到datatable中
Datatable dt=;//写个公共方法创建datatable
dt.Rows.Clear();
for (int i = 0; i < GridView1.Rows.Count; i++)
{
}
}
2、再添加一行的按钮点击事件里调用这个方法
protected void Button2_Click(object sender, EventArgs e)
{
     DataTable dt = getDataTable();
     //添加一空行
     DataRow dr = dt.NewRow();
     //给每一列赋值
     dr[“”]=””;
     dr[“”]=””;
     dr[“”]=””;
     //绑定数据
     dt.Rows.Add(dr);
     GridView1.DataSource = dt;
     GridView1.DataBind();
}

#9


每次都给viewstate附新值,肯定是一条啊,你给了viewstate但是每次应该循环得到原来的值,然后再添加吧?我是这样任务地,看看我给写的方法,改改
引用 7 楼 hao527 的回复:
我现在把代码改成如下还是添加不了多行数据啊。。。麻烦帮我看看那里错了。。。

public partial class AddGoods : System.Web.UI.Page
{
  int i = 0;
  DataTable dt = new DataTable("AddGoods");
   
   
  protected void Page_Load(object s……

#10


引用 9 楼 hufenglongyy 的回复:
每次都给viewstate附新值,肯定是一条啊,你给了viewstate但是每次应该循环得到原来的值,然后再添加吧?我是这样任务地,看看我给写的方法,改改

引用 7 楼 hao527 的回复:
我现在把代码改成如下还是添加不了多行数据啊。。。麻烦帮我看看那里错了。。。

public partial class AddGoods : System.Web.UI.Page
{
int……



那我要怎样才能循环存入viewstate呢?

#11


干什么总得要viewstate呢?我的那个实现的效果和你的是一样的,要用viewstate也行,声明一个viewstate用于存储datatable数据,那么在按钮点击事件里你首先要将viewstate转换datatable得到里面的数据,将数据循环插入datatable,在将新的数据插入datatable,然后将datatable赋值给viewstate,只有这样每次才能将前面的数据加上,你写的根本没有得到viewstate中的数据,而每次给viewstate付了一条新值,所以每次都是一条,呵呵,希望对你有用

#12


引用 11 楼 hufenglongyy 的回复:
干什么总得要viewstate呢?我的那个实现的效果和你的是一样的,要用viewstate也行,声明一个viewstate用于存储datatable数据,那么在按钮点击事件里你首先要将viewstate转换datatable得到里面的数据,将数据循环插入datatable,在将新的数据插入datatable,然后将datatable赋值给viewstate,只有这样每次才能将前面的数据加上,你写的……



因为我看了下你的方法。。有点看不懂。。刚学.net。。。不好意思啊。。。好的。。我去试试。。

#13


引用 3 楼 qgqch2008 的回复:
你每次调用DAL的方法DataTable dt = new DataTable("AddGoods");都会重新实例化一次,每次只把当前的值放到gridview上,不会累加。
可以用viewstate保存当前的gridview的值,每次向viewstate中添加数据,然后绑定到girdview上面去。
我如何选中这个gridview中的某行呢?楼主可以添加一个  
<Columns>
  ……



我在selectindexchanged()方法里面写我的方法了,就是想选择了一行后返回这这一行的数据给我的textbox控件,我是这么写的,可是点击了没反应。。。是什么原因呢???

    protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
    {
        TextBox1.Text = GridView1.SelectedRow.Cells[1].Text;
        TextBox2.Text = GridView1.SelectedRow.Cells[2].Text;
        TextBox3.Text = GridView1.SelectedRow.Cells[3].Text;
        TextBox4.Text = GridView1.SelectedRow.Cells[4].Text;
        TextBox5.Text = GridView1.SelectedRow.Cells[5].Text;
        TextBox6.Text = GridView1.SelectedRow.Cells[6].Text;
     }

#14


为什么不直接把表单的数据插入到数据库里,然后再去控件里绑定出来!!

我觉得这是一个什么样的业务,你需要明确!!

#15


引用 14 楼 chongerwing 的回复:
为什么不直接把表单的数据插入到数据库里,然后再去控件里绑定出来!!

我觉得这是一个什么样的业务,你需要明确!!


这个好比购物车那样吧。。。一个订单会有多个商品,所以在一个订单添加多个商品的时候,你要把这多个商品放在一个datatable上面啊,最后再提交表单的时候把这个整个页面的订单写进数据库里面。。。

#16


lz搞定了吗,我也有这个问题

#17


http://topic.csdn.net/u/20111116/14/37319feb-456f-4c2b-88e0-8042ed3e5064.html?2057630353
lz,上这看12楼可以解决你的问题

#1


DataTable dt = new DataTable("AddGoods");
放在外面就可以了
saveGoods方法每次给dt添加一行

#2


你这样的DataTable每次只能存一次提交的值

#3


你每次调用DAL的方法DataTable dt = new DataTable("AddGoods");都会重新实例化一次,每次只把当前的值放到gridview上,不会累加。
可以用viewstate保存当前的gridview的值,每次向viewstate中添加数据,然后绑定到girdview上面去。
我如何选中这个gridview中的某行呢?楼主可以添加一个        
<Columns>
            <asp:CommandField HeaderText="选择" ShowSelectButton="True" />
</Columns>
然后在SelectedIndexChanged事件中写你的操作。。。

#4


引用 1 楼 thinkingforever 的回复:
DataTable dt = new DataTable("AddGoods");
放在外面就可以了
saveGoods方法每次给dt添加一行



saveGoods方法就是每次执行都添加一行了吧?对datatable不太熟悉。。。

#5


引用 3 楼 qgqch2008 的回复:
你每次调用DAL的方法DataTable dt = new DataTable("AddGoods");都会重新实例化一次,每次只把当前的值放到gridview上,不会累加。
可以用viewstate保存当前的gridview的值,每次向viewstate中添加数据,然后绑定到girdview上面去。
我如何选中这个gridview中的某行呢?楼主可以添加一个  
<Columns>
  ……



这个viewstate怎么用呢?不知道如何用啊。。。可以举个例子不?

#6



public string Text 
{   
     get { return (string)ViewState["Text"]; }   
     set { ViewState["Text"] = value; }
}


#7


我现在把代码改成如下还是添加不了多行数据啊。。。麻烦帮我看看那里错了。。。

public partial class AddGoods : System.Web.UI.Page
{
    int i = 0;
    DataTable dt = new DataTable("AddGoods");
    
    
    protected void Page_Load(object sender, EventArgs e)
    {
        DataColumn dc = null;
        dc = dt.Columns.Add("ID", Type.GetType("System.Int32"));
        dc.AutoIncrement = true;//自动增加
        dc.AutoIncrementSeed = 1;//起始为1
        dc.AutoIncrementStep = 1;//步长为1
        dc.AllowDBNull = false;//

        dc = dt.Columns.Add("GoodsId", Type.GetType("System.Int32"));
        dc = dt.Columns.Add("Name", Type.GetType("System.String"));
        dc = dt.Columns.Add("Locality", Type.GetType("System.String"));
        dc = dt.Columns.Add("Unit", Type.GetType("System.String"));
        dc = dt.Columns.Add("Guige", Type.GetType("System.String"));
        dc = dt.Columns.Add("Price", Type.GetType("System.Int32"));
        dc = dt.Columns.Add("Num", Type.GetType("System.Int32"));
        dc = dt.Columns.Add("Count", Type.GetType("System.Int32"));

        

    }

        protected void Button3_Click(object sender, EventArgs e)
    {
        
        
        
        
        string GoodsId = TextBox1.Text;
        string Name = TextBox2.Text;
        string Locality = TextBox3.Text;
        string Unit = TextBox4.Text;
        string Guige = TextBox5.Text;
        string Price = TextBox6.Text;
        string Num = TextBox7.Text;
        string Count = TextBox8.Text;

        DataRow newRow;
        newRow = dt.NewRow();
        newRow["GoodsId"] = ag.GoodsId;
        newRow["Name"] = ag.Name;
        newRow["Locality"] = ag.Locality;
        newRow["Unit"] = ag.Unit;
        newRow["Guige"] = ag.Guige;
        newRow["Price"] = ag.Price;
        newRow["Num"] = ag.Num;
        newRow["Count"] = ag.Count;

        dt.Rows.Add(newRow);
        ViewState["dt"] = dt;

        GridView1.DataSource = (DataTable)ViewState["dt"];
        GridView1.DataBind();
        
        
   }

#8


1、写个得到数据的方法
public DataTable getDataTable()
{
//这里主要是循环gridview中的数据
将gridview中的数据添加到datatable中
Datatable dt=;//写个公共方法创建datatable
dt.Rows.Clear();
for (int i = 0; i < GridView1.Rows.Count; i++)
{
}
}
2、再添加一行的按钮点击事件里调用这个方法
protected void Button2_Click(object sender, EventArgs e)
{
     DataTable dt = getDataTable();
     //添加一空行
     DataRow dr = dt.NewRow();
     //给每一列赋值
     dr[“”]=””;
     dr[“”]=””;
     dr[“”]=””;
     //绑定数据
     dt.Rows.Add(dr);
     GridView1.DataSource = dt;
     GridView1.DataBind();
}

#9


每次都给viewstate附新值,肯定是一条啊,你给了viewstate但是每次应该循环得到原来的值,然后再添加吧?我是这样任务地,看看我给写的方法,改改
引用 7 楼 hao527 的回复:
我现在把代码改成如下还是添加不了多行数据啊。。。麻烦帮我看看那里错了。。。

public partial class AddGoods : System.Web.UI.Page
{
  int i = 0;
  DataTable dt = new DataTable("AddGoods");
   
   
  protected void Page_Load(object s……

#10


引用 9 楼 hufenglongyy 的回复:
每次都给viewstate附新值,肯定是一条啊,你给了viewstate但是每次应该循环得到原来的值,然后再添加吧?我是这样任务地,看看我给写的方法,改改

引用 7 楼 hao527 的回复:
我现在把代码改成如下还是添加不了多行数据啊。。。麻烦帮我看看那里错了。。。

public partial class AddGoods : System.Web.UI.Page
{
int……



那我要怎样才能循环存入viewstate呢?

#11


干什么总得要viewstate呢?我的那个实现的效果和你的是一样的,要用viewstate也行,声明一个viewstate用于存储datatable数据,那么在按钮点击事件里你首先要将viewstate转换datatable得到里面的数据,将数据循环插入datatable,在将新的数据插入datatable,然后将datatable赋值给viewstate,只有这样每次才能将前面的数据加上,你写的根本没有得到viewstate中的数据,而每次给viewstate付了一条新值,所以每次都是一条,呵呵,希望对你有用

#12


引用 11 楼 hufenglongyy 的回复:
干什么总得要viewstate呢?我的那个实现的效果和你的是一样的,要用viewstate也行,声明一个viewstate用于存储datatable数据,那么在按钮点击事件里你首先要将viewstate转换datatable得到里面的数据,将数据循环插入datatable,在将新的数据插入datatable,然后将datatable赋值给viewstate,只有这样每次才能将前面的数据加上,你写的……



因为我看了下你的方法。。有点看不懂。。刚学.net。。。不好意思啊。。。好的。。我去试试。。

#13


引用 3 楼 qgqch2008 的回复:
你每次调用DAL的方法DataTable dt = new DataTable("AddGoods");都会重新实例化一次,每次只把当前的值放到gridview上,不会累加。
可以用viewstate保存当前的gridview的值,每次向viewstate中添加数据,然后绑定到girdview上面去。
我如何选中这个gridview中的某行呢?楼主可以添加一个  
<Columns>
  ……



我在selectindexchanged()方法里面写我的方法了,就是想选择了一行后返回这这一行的数据给我的textbox控件,我是这么写的,可是点击了没反应。。。是什么原因呢???

    protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
    {
        TextBox1.Text = GridView1.SelectedRow.Cells[1].Text;
        TextBox2.Text = GridView1.SelectedRow.Cells[2].Text;
        TextBox3.Text = GridView1.SelectedRow.Cells[3].Text;
        TextBox4.Text = GridView1.SelectedRow.Cells[4].Text;
        TextBox5.Text = GridView1.SelectedRow.Cells[5].Text;
        TextBox6.Text = GridView1.SelectedRow.Cells[6].Text;
     }

#14


为什么不直接把表单的数据插入到数据库里,然后再去控件里绑定出来!!

我觉得这是一个什么样的业务,你需要明确!!

#15


引用 14 楼 chongerwing 的回复:
为什么不直接把表单的数据插入到数据库里,然后再去控件里绑定出来!!

我觉得这是一个什么样的业务,你需要明确!!


这个好比购物车那样吧。。。一个订单会有多个商品,所以在一个订单添加多个商品的时候,你要把这多个商品放在一个datatable上面啊,最后再提交表单的时候把这个整个页面的订单写进数据库里面。。。

#16


lz搞定了吗,我也有这个问题

#17


http://topic.csdn.net/u/20111116/14/37319feb-456f-4c2b-88e0-8042ed3e5064.html?2057630353
lz,上这看12楼可以解决你的问题