Votre événement de chargement de page ne sont pas vérifier si elle est un poste de retour:
If Not IsPostBack Then
'process code if it is not a post back
End If
Chaque fois que vous cliquez sur le bouton btnAdd votre page fait un message au serveur.
Je viens de remarquer que vous ne comprenez probablement pas la durée de vie d'un objet.
Vous aviez fait cela dans votre code:
Public dt As New DataTable
Le problème qui est que vous avez défini est une variable de classe et une fois que la page a chargé avoir une instance de type dt qui peut avoir des colonnes associé avec. Mais dès que vous enregistrez un événement tel qu'un clic sur un bouton, cette référence est détruite et un nouveau dt est créé.
Vous devrez utiliser des variables de session ou une base de données pour stocker l'état de dt.
Voici un exemple en 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();
}
Et le même code dans 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
Alors maintenant, ce que le code fait est instancier un nouvel objet datatable aussi longtemps que nous sont sur la page (premier post retour) et ajoute les colonnes. Une fois la table de données définie, nous la lançons dans un état de session. Lorsque vous cliquez sur le bouton Ajouter, vous ne pouvez pas utiliser dt dans votre code précédent, car la portée dt a été perdue dans votre code précédent. Nous faisons cela en assignant la datatable sessioned qui a été stockée avant une datable temporaire. Nous ajoutons la ligne et réinitialisons la session de cette façon la prochaine fois que nous ajoutons une ligne, elle affichera la deuxième rangée, puis la troisième rangée, et ainsi de suite ...
Je recommande un bon livre asp.net sur Début ASP.net 3.5 en C# 2008. Il y a une tonne de livres vb.net sur le même sujet.
Merci d'avoir été très utile –
Comment afficher la vue de la grille avec l'ordre par colonne dans le scienario ci-dessus – Vikram