2010-01-04 5 views
4

J'ai le code suivant:datatable liaison à la vue grille

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 

Le problème est-il montre qu'une seule ligne ou un enregistrement. Comment faire pour montrer de nombreux disques?

Répondre

8

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.

+0

Merci d'avoir été très utile –

+0

Comment afficher la vue de la grille avec l'ordre par colonne dans le scienario ci-dessus – Vikram

0

Vous devez enregistrer la donnée dans Session, car les variables locales ne sont pas conservées. Vous devez donc faire:

protected override OnLoad(..) //or OnInit 
{ 
    dt = Session["DataTable"] as DataTable; 
    if (dt == null) 
    { 
     dt = new DataTable(); 
     //load columns 
    } 
} 

protected override OnUnLoad(..) 
{ 
    Session["DataTable"] = dt; 
} 

La session enregistre la référence de la table de données entre les publications, car le site Web est sans état.

+0

Je ne stockerais pas de DataTable dans Session, car vous le stockez en mémoire sur le serveur. Que se passe-t-il si votre application est équilibrée en charge sur plusieurs serveurs? Que se passe-t-il si la table devient plus grande que x nombre de lignes ou si vous avez un nombre d'utilisateurs supérieur à ce que vous avez aujourd'hui? – dustin

+0

C'est aussi ce que fait la solution de JonH; vous devez le stocker quelque part, ou recharger de la base de données sur chaque chargement de la page; malheureusement, une variable globale ne conserve aucune de ses valeurs donc elle est essentiellement perdue à chaque fois .... mais le chargement à partir de DB ou en utilisant le cache ou autre stockage de données (disque io comme fichier XMl) sont aussi des options viables ... session n'est pas la seule solution, mais souvent choisie parce qu'elle est spécifique à l'utilisateur. Et vous avez raison, plusieurs serveurs sont également un problème ... vous devez donc trouver la bonne solution. –

+0

@dustinupdyke - il n'y a rien de mal pour cet exemple particulier pour stocker cela dans une session. Je suppose que vous avez lu la question, c'est assez basique. Bien sûr, si votre application est équilibrée, c'est une question entièrement différente en soi. On peut écrire leur propre mécanisme de mise en cache personnalisé. En fin de compte, vous devez savoir quoi choisir. L'auteur de ce post ne cherche rien de haut niveau et la session fonctionne parfaitement bien dans ce cas. – JonH

0

Je posté de Réponse dans ce LINK

J'ai donné code complet de votre problème.

Questions connexes