你的页面加载事件你没有检查它是否是回发:
If Not IsPostBack Then
'process code if it is not a post back
End If
每次单击 btnAdd 按钮时,您的页面都会向服务器发送回帖。
我刚刚注意到您可能不了解对象的生命周期。
你已经在你的代码中这样做了:
Public dt As New DataTable
问题在于你已经定义了这是一个类变量,一旦页面加载,你就有了一个 dt 类型的实例,它可能有一些与之关联的列。但是,一旦您记录了诸如单击按钮之类的事件,该引用就会被销毁并创建一个新的 dt。
您将不得不使用会话变量或数据库来存储 dt 的状态。
这是一个 C# 示例:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
DataTable dt = new DataTable();
dt.Columns.Add("ID", System.Type.GetType("System.Int32"));
dt.Columns.Add("univirsity", System.Type.GetType("System.Int32"));
dt.Columns.Add("major", System.Type.GetType("System.Int32"));
Session["MyDataTable"] = dt;
}
}
protected void btnAdd_Click(object sender, EventArgs e)
{
DataTable t = (DataTable)Session["MyDataTable"];
DataRow row1 = t.NewRow();
row1["ID"] = t.Rows.Count + 1;
row1["univirsity"] = 3;
row1["major"] = 31;
t.Rows.Add(row1);
Session["MyDataTable"] = t;
GridView1.DataSource = t;
GridView1.DataBind();
}
和 vb.net 中相同的代码:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
If Not Page.IsPostBack Then
Dim dt As New DataTable()
dt.Columns.Add("ID", System.Type.[GetType]("System.Int32"))
dt.Columns.Add("univirsity", System.Type.[GetType]("System.Int32"))
dt.Columns.Add("major", System.Type.[GetType]("System.Int32"))
Session("MyDataTable") = dt
End If
End Sub
Protected Sub btnAdd_Click(ByVal sender As Object, ByVal e As EventArgs)
Dim t As DataTable = DirectCast(Session("MyDataTable"), DataTable)
Dim row1 As DataRow = t.NewRow()
row1("ID") = t.Rows.Count + 1
row1("univirsity") = 3
row1("major") = 31
t.Rows.Add(row1)
Session("MyDataTable") = t
GridView1.DataSource = t
GridView1.DataBind()
End Sub
所以现在代码所做的就是实例化一个新的数据表对象,只要我们在页面上(第一次回发)并添加列。一旦它定义了数据表,我们就将它置于某个会话状态。当您单击添加按钮时,您不能在之前的代码中继续使用 dt,因为 dt 范围在您之前的代码中丢失了。我们通过分配在临时数据表之前存储的会话数据表来做到这一点。我们添加行并以这种方式重置会话,下次添加行时,它将显示第二行,然后是第三行,依此类推...
我推荐一本很好的 asp.net 书籍,例如在 C# 2008 中开始 ASP.net 3.5。有大量关于同一主题的 vb.net 书籍。