Событие загрузки вашей страницы, которое вы не проверяете, является ли это возвращением:
If Not IsPostBack Then
'process code if it is not a post back
End If
Каждый раз, когда вы нажимаете кнопку btnAdd, ваша страница отправляет сообщение обратно на сервер.
Я только что заметил, что вы, вероятно, не понимаете время жизни объекта.
Вы сделали это в своем коде:
Public dt As New DataTable
Проблема в том, что вы определили, что это переменная класса, и после загрузки страницы у вас есть экземпляр типа 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, такую как Beginning ASP.net 3.5 в C # 2008. Есть тонна книг vb.net на ту же тему.