我有以下代码:
Imports System.Data Partial Class Students_AddWishes Inherits System.Web.UI.Page Public dt As New DataTable Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 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")) End Sub Protected Sub btnAdd_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAdd.Click Dim row1 As DataRow = dt.NewRow() row1("ID") = dt.Rows.Count + 1 row1("univirsity") = ddlUnivs.SelectedValue row1("major") = ddlMajors.SelectedValue dt.Rows.Add(row1) GridView1.DataSource = dt GridView1.DataBind() End Sub End Class
问题是它只显示一行或记录.如何让它显示许多记录?
您的页面加载事件,您没有检查它是否是回发:
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中的Beginning ASP.net 3.5.有很多关于同一主题的vb.net书籍.