界面如下:
       商品编号    商品名称   数量   单价   金额     备注     操作
       tbstkno     tbstkname  qty    price  sumoney  memo     btnadd   (这一行为web控件)(我写的是控件ID)在以上控件中填充数据后,点btnadd按钮通过DataTable绑定到gridview里,在页面上显示出来。
gridview是自动生成列,绑定的是由DataTable中创建的列。并把DataTable保存到了ViewState["DT"]中。
往gridview中添加完数据后,再点一个btninsert按钮,把gridview的数据行插入到数据,能成功插入。
并且在btninsert按钮事件中成功插入数据后加上了
GridView1.DataSource = null;
GridView1.DataBind();
这样把gridview1中的数据清空了。
在btninsert按钮旁边还有一个btnaddnew按钮,这个按钮是新建一张新的单据,
问题来了,当然点击btnadd按钮往gridview中加入一个条新记录时,上次清空的数据行就回来了,和这条新加的记录一块填充到了gridview中。
请问这是怎么回事啊?
谢谢!!!

解决方案 »

  1.   

    protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                //初始化DataTable 加列
                DataTable dt = new DataTable();
                dt.Columns.Add(new DataColumn("stkno"));
                dt.Columns.Add(new DataColumn("stkname"));
                dt.Columns.Add(new DataColumn("baseunit"));
                dt.Columns.Add(new DataColumn("baseqty"));
                dt.Columns.Add(new DataColumn("bulkprice"));
                dt.Columns.Add(new DataColumn("summoney"));
                dt.Columns.Add(new DataColumn("fkmoney"));
                dt.Columns.Add(new DataColumn("sjmoney"));
                dt.Columns.Add(new DataColumn("memo1"));
                //dt.Columns.Add(new DataColumn("memo2"));
                dt.Columns.Add(new DataColumn("id"));
                dt.Columns.Add(new DataColumn("StkGroupName"));
                ViewState["DT"] = dt;
                sss();
            }
        }
        //绑定商品
        private void sss()
        {
            GridView1.DataSource = ViewState["DT"];
            GridView1.DataBind();
        }
        //添加商品
        protected void btnadd_Click(object sender, EventArgs e)
        {
            if (Convert.ToDecimal(tbxfkmoney.Text.ToString()) > Convert.ToDecimal(tbxsummoney.Text.ToString())) 
            {
                ClientScript.RegisterStartupScript(this.GetType(), "", "<script>alert('返款金额不能大于订单金额!');</script>");
            }
            else
            {
                DataTable dt = (DataTable)ViewState["DT"];
                DataRow row = dt.NewRow();            //为DATATABLE赋值
                row["stkno"] = tbxstkno.Text;
                row["stkname"] = tbxstkname.Text;
                row["baseunit"] = tbxbaseunit.Text;
                row["baseqty"] = tbxqty.Text;
                row["bulkprice"] = tbxprice.Text;
                row["summoney"] = Convert.ToDecimal(tbxprice.Text) * Convert.ToDecimal(tbxqty.Text);
                row["fkmoney"] = tbxfkmoney.Text;
                row["sjmoney"] = tbxsjmoney.Text;
                row["memo1"] = tbxmemo1.Text.ToString().Trim();
                //row["memo2"] = tbxmemo2.Text;
                row["ID"] = HiddenField3.Value.ToString();
                row["StkGroupName"] = HiddenField4.Value.ToString();
                dt.Rows.Add(row);            //绑定到GRIDVIEW上
                sss();
                ViewState["DT"] = dt;            //把上次的记录清空
                tbxstkno.Text = "";
                tbxstkname.Text = "";
                tbxbaseunit.Text = "";
                tbxqty.Text = "";
                tbxprice.Text = "";
                tbxsummoney.Text = "";
                tbxfkmoney.Text = "";
                tbxsjmoney.Text = "";
                tbxmemo1.Text = "";
                //tbxmemo2.Text = "";
            }    }
    //插入单据
        protected void btninsert_Click(object sender, EventArgs e)
        {
           代码太多了,跟这儿也没关系,就不贴了.
        }
    //新建单据
        protected void btnaddnew_Click(object sender, EventArgs e)
        {
            GridView1.DataSource = null;
            GridView1.DataBind();
            
        }
      

  2.   

    你新建单据时把 ViewState["DT"] 清空掉呢?
    ViewState有缓存效果。
      

  3.   

    不行啊,我在新建事件里加入了 
    ViewState["DT"] = null;
    GridView1.DataSource = ViewState["DT"] ;
    GridView1.DataBind();
    提示:未将对象设置到对象实例。
    另外在初始datatable时,我把datatable生成的列结构保存到了ViewState["DTnew"]中后,
    GridView1.DataSource = ViewState["DTnew"] ;
    GridView1.DataBind();
    也不行,上次的记录又出来了,按原理来说,应该没有数据了~~~
    还有别的办法吗?
    谢谢!!!
      

  4.   

    sss();
    ViewState["DT"] = dt; 
    换下顺序
    ViewState["DT"] = dt; 
    sss();
      

  5.   

    不懂你的table怎样做的。
    新建事件可以把table里面的数据全部拿掉
    DataTable dt = (DataTable)ViewState["DT"];
    dt.Rows.Clear();
    ViewState["DT"]=dt;下面这个可能很乱,我只放了一个新的(Button2),一个add(Button1)
    ---------------------------
    private void databind()
    {
    this.DG.DataSource=ViewState["DT"];
    this.DG.DataBind();
    } private void Button1_Click(object sender, System.EventArgs e)
    {
    if(ViewState["DT"] !=null)
    {
    DataTable dt = (DataTable)ViewState["DT"];
    DataRow dr = dt.NewRow();
    dr["Row"] = "02";
    dr["sku"] = "TefadsdfasdstSKU";
    dr["descr"] = "Sku descrdasiption test";
    dr["qty"] = "99dd";
    dr["res"] = "ddRes field";
    dt.Rows.Add(dr);
    ViewState["DT"]=dt;
    }
    else
    {
    DataSet ds = new DataSet();
    ds.Tables.Add();
    ds.Tables[0].Columns.Add("row");
    ds.Tables[0].Columns.Add("sku");
    ds.Tables[0].Columns.Add("descr");
    ds.Tables[0].Columns.Add("qty");
    ds.Tables[0].Columns.Add("res");
    DataRow dr = ds.Tables[0].NewRow();
    dr["Row"] = "02";
    dr["sku"] = "TefadsdfasdstSKU";
    dr["descr"] = "Sku descrdasiption test";
    dr["qty"] = "99dd";
    dr["res"] = "ddRes field";
    ds.Tables[0].Rows.Add(dr);
    ViewState["DT"]=ds.Tables[0];
    }

    databind();
    } private void Button2_Click(object sender, System.EventArgs e)
    {
    ViewState["DT"]=null;
    databind();
    }
      

  6.   

    谢谢 rainnight83
    我试一下`~
      

  7.   

     非常感谢
    rainnight83没有问题了`~~方便的话大家帮我看看 
    http://topic.csdn.net/u/20100304/11/04557c16-09fc-4d08-9aeb-e7b478a7c346.html?seed=1417610498&r=63699876#r_63699876
    这个贴子. 谢谢`~~!!!!!