百盛万佳 2019-06-18 23:09 采纳率: 0%
浏览 180

C# datatable 插入行,之前插入的为何不能保存?

前台

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="inproduct.aspx.cs" Inherits="inproduct" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>        
            <asp:Button ID="Button1" runat="server" Text="添加第一行" OnClick="Button1_Click" />
            <asp:Button ID="Button2" runat="server" Text="添加第二行" OnClick="Button2_Click" />
            <asp:GridView ID="GridView1" runat="server" EnableModelValidation="True">
            </asp:GridView>

        </div>
    </form>
</body>
</html>

后台

using System;
using System.Collections.Generic;
using System.Data;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class inproduct : System.Web.UI.Page
{

    public DataTable dt = new DataTable();
    protected void Page_Load(object sender, EventArgs e)
    {

        DataColumn dc1 = new DataColumn("prizename", Type.GetType("System.String"));
        DataColumn dc2 = new DataColumn("point", Type.GetType("System.Int16"));
        DataColumn dc3 = new DataColumn("number", Type.GetType("System.Int16"));
        DataColumn dc4 = new DataColumn("totalpoint", Type.GetType("System.Int64"));
        DataColumn dc5 = new DataColumn("prizeid", Type.GetType("System.String"));
        dt.Columns.Add(dc1);
        dt.Columns.Add(dc2);
        dt.Columns.Add(dc3);
        dt.Columns.Add(dc4);
        dt.Columns.Add(dc5);
        DataRow dr = dt.NewRow();
        dr["prizename"] = "娃娃1";
        dr["point"] = 10;
        dr["number"] = 1;
        dr["totalpoint"] = 10;
        dr["prizeid"] = "001";
        dt.Rows.Add(dr);
        GridView1.DataSource = dt;
        GridView1.DataBind();
    }


    protected void Button1_Click(object sender, EventArgs e)
    {
        DataRow dr = dt.NewRow();
        dr["prizename"] = "娃娃2";
        dr["point"] = 20;
        dr["number"] = 2;
        dr["totalpoint"] = 20;
        dr["prizeid"] = "002";
        dt.Rows.Add(dr);
        GridView1.DataSource = dt;
        GridView1.DataBind();
    }

    protected void Button2_Click(object sender, EventArgs e)
    {
        DataRow dr2 = dt.NewRow();
        dr2["prizename"] = "娃娃3";
        dr2["point"] = 30;
        dr2["number"] = 3;
        dr2["totalpoint"] = 30;
        dr2["prizeid"] = "003";
        dt.Rows.Add(dr2);

        GridView1.DataSource = dt;
        GridView1.DataBind();
    }
}
  • 写回答

1条回答 默认 最新

  • 芣苢的成长之路 2023-06-27 12:04
    关注

    你的代码中存在一个问题,即在每次添加新的行数据之后,你没有将DataTable对象保存到ViewState或Session中,因此在页面回发之后,DataTable对象中之前添加的数据会被清空。因此,如果你想要保存之前添加的数据,你需要在每次添加新的数据之后,将DataTable对象保存到ViewState或Session中。

    
    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    public partial class inproduct : System.Web.UI.Page
    {
        public DataTable dt;
    
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                dt = new DataTable();
                DataColumn dc1 = new DataColumn("prizename", Type.GetType("System.String"));
                DataColumn dc2 = new DataColumn("point", Type.GetType("System.Int16"));
                DataColumn dc3 = new DataColumn("number", Type.GetType("System.Int16"));
                DataColumn dc4 = new DataColumn("totalpoint", Type.GetType("System.Int64"));
                DataColumn dc5 = new DataColumn("prizeid", Type.GetType("System.String"));
                dt.Columns.Add(dc1);
                dt.Columns.Add(dc2);
                dt.Columns.Add(dc3);
                dt.Columns.Add(dc4);
                dt.Columns.Add(dc5);
                DataRow dr = dt.NewRow();
                dr["prizename"] = "娃娃1";
                dr["point"] = 10;
                dr["number"] = 1;
                dr["totalpoint"] = 10;
                dr["prizeid"] = "001";
                dt.Rows.Add(dr);
                ViewState["dt"] = dt;
                GridView1.DataSource = dt;
                GridView1.DataBind();
            }
            else
            {
                dt = (DataTable)ViewState["dt"];
                GridView1.DataSource = dt;
                GridView1.DataBind();
            }
        }
    
        protected void Button1_Click(object sender, EventArgs e)
        {
            dt = (DataTable)ViewState["dt"];
            DataRow dr = dt.NewRow();
            dr["prizename"] = "娃娃2";
            dr["point"] = 20;
            dr["number"] = 2;
            dr["totalpoint"] = 20;
            dr["prizeid"] = "002";
            dt.Rows.Add(dr);
            ViewState["dt"] = dt;
            GridView1.DataSource = dt;
            GridView1.DataBind();
        }
    
        protected void Button2_Click(object sender, EventArgs e)
        {
            dt = (DataTable)ViewState["dt"];
            DataRow dr2 = dt.NewRow();
            dr2["prizename"] = "娃娃3";
            dr2["point"] = 30;
            dr2["number"] = 3;
            dr2["totalpoint"] = 30;
            dr2["prizeid"] = "003";
            dt.Rows.Add(dr2);
            ViewState["dt"] = dt;
            GridView1.DataSource = dt;
            GridView1.DataBind();
        }
    }
    

    在修改后的代码中,我们首先在Page_Load事件中判断页面是否是回发(Postback),如果不是回发,则创建一个新的DataTable对象,并向其中添加一行数据。然后,我们将DataTable对象保存到ViewState中。如果页面是回发,则从ViewState中获取之前保存的DataTable对象,并重新绑定GridView控件。

    在Button1_Click和Button2_Click事件中,我们首先从ViewState中获取保存的DataTable对象,然后向其中添加新的行数据,并将DataTable对象重新保存到ViewState中。最后,我们重新绑定GridView控件,以显示最新的数据。

    这样,你就可以在每次添加新的行数据之后,保存DataTable对象到ViewState中,从而确保之前添加的数据不会被清空。

    评论

报告相同问题?

悬赏问题

  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面
  • ¥50 NT4.0系统 STOP:0X0000007B
  • ¥15 想问一下stata17中这段代码哪里有问题呀