2012-12-01 5 views
-1

J'ai besoin de transférer des données des contrôles de la page2 au contrôle GridView à la page1 en appuyant sur le bouton. (sans utiliser de base de données)ASP.NET - Transfert de données entre deux pages

J'ai essayé d'utiliser DataTable pour stocker des données et les organiser en colonnes/lignes.

Mais quand je clique sur le bouton, j'obtiens une exception disant: "La référence d'objet n'est pas définie sur une instance d'un objet." à la ligne 58. -> DataRow dr = dt.NewRow();

Page2 C# code:

public partial class WebForm1 : System.Web.UI.Page 
{ 
    //Lastnosti 
    public string IDizposoje 
    { 
     get { return TextBox3.Text; } 
    } 

    public string Ime 
    { 
     get { return TextBox1.Text; } 
    } 

    public string Priimek 
    { 
     get { return TextBox2.Text; } 
    } 

    public string DatumIzposoje 
    { 
     get { return Calendar1.SelectedDate.ToString(); } 
    } 

    public string DatumVrnitve 
    { 
     get { return Calendar2.SelectedDate.ToString(); } 
    } 

    public string VrstaAvtomobila 
    { 
     get { return ListBox1.SelectedItem.Text; } 
    } 

    //Koda, ki se izvrši ob zagonu 
    protected void Page_Load(object sender, EventArgs e, DataTable dt) 
    {   
    } 

    //Ob kliku na gumb "Prekliči" zapremo stran 
    protected void Button2_Click(object sender, EventArgs e) 
    { 
     //Response.Redirect("~/Default.aspx"); 
     this.ClientScript.RegisterClientScriptBlock(this.GetType(), "Close", "window.close()", true); 
    } 

    //Napolnimo tabelo s podatki 
    public void NapolniTabelo(DataTable dt) 
    { 
     DataRow dr = dt.NewRow(); 

     dr["ID"] = TextBox3.Text; 
     dr["Ime"] = TextBox1.Text; 
     dr["Priimek"] = TextBox2.Text; 
     dr["Datum izposoje"] = Calendar1.SelectedDate.ToString(); 
     dr["Datum vrnitve"] = Calendar2.SelectedDate.ToString(); 
     dr["Vrsta avtomobila"] = ListBox1.SelectedValue.ToString(); 

     dt.Rows.Add(dr); 
    } 

    protected void Button1_Click(object sender, EventArgs e) 
    { 
     NapolniTabelo((DataTable)Session["tabela"]); 
     /*Session["ID"] = TextBox3.Text; 
     Session["Ime"] = TextBox1.Text; 
     Session["Priimek"] = TextBox2.Text; 
     Session["Datum izposoje"] = Calendar1.SelectedDate.ToString(); 
     Session["Datum vrnitve"] = Calendar2.SelectedDate.ToString(); 
     Session["Vrsta avtomobila"] = ListBox1.SelectedValue.ToString();*/ 
     Response.Redirect("Default.aspx"); 
    } 

    //Ponastavimo gradnike 
    protected void Button3_Click(object sender, EventArgs e) 
    { 
     TextBox1.Text = ""; 
     TextBox2.Text = ""; 
     TextBox3.Text = ""; 
     Calendar1.SelectedDate = DateTime.Now; 
     Calendar2.SelectedDate = DateTime.Now; 
     ListBox1.SelectedIndex = 0; 
    } 
} 

Page1 C# code:

public partial class _Default : System.Web.UI.Page 
{ 
    private DataTable UstvariTabelo() 
    { 
     DataTable dt = new DataTable(); 

     dt.Columns.Add(new DataColumn("ID", typeof(string))); 
     dt.Columns.Add(new DataColumn("Ime", typeof(string))); 
     dt.Columns.Add(new DataColumn("Priimek", typeof(string))); 
     dt.Columns.Add(new DataColumn("Datum izposoje", typeof(string))); 
     dt.Columns.Add(new DataColumn("Datum vrnitve", typeof(string))); 
     dt.Columns.Add(new DataColumn("Vrsta vozila", typeof(string))); 

     return dt; 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     WebForm1 druga = new WebForm1(); 
     DataTable tabela = UstvariTabelo(); 

     druga.NapolniTabelo(tabela); 

     this.GridView1.Visible = true; 
     this.GridView1.DataSource = ((DataTable)Session["tabela"]); 
     this.GridView1.DataBind(); 
    } 
} 

Où est-ce que je me trompe?

+0

Où est un code qui stocke une instance DataTable dans la session? – sll

Répondre

0
DataRow dr = dt.NewRow(); 

Il soulève exception, car l'objet datatable (dt) n'est pas en mémoire et que vous essayez d'y accéder. Pour le conserver sur deux pages, vous pouvez utiliser des variables de session. Ex:

En page 1:

DataTable dt = UstvariTabelo(); //I think this method is returning data table in page 1 
//load data into dt 
Session["test"] = dt; //save it into a session variable 

En page 2, vous pouvez récupérer la valeur de session enregistrée

if(Session["test"]!=null) 
{ 
    DataTable dt = (DataTable) Session["test"]; 
} 

également dans votre page 1 code, vous n'êtes pas assignez une variable de session avant de l'extraire à la page 2.

protected void Page_Load(object sender, EventArgs e) 
    { 
     WebForm1 druga = new WebForm1(); 
     DataTable tabela = UstvariTabelo(); 

     druga.NapolniTabelo(tabela); 

     this.GridView1.Visible = true; 
     Session["tabela"] = tabela;//<--------assign it to session 
     this.GridView1.DataSource = tabela; 
     this.GridView1.DataBind(); 
    } 
+0

Des conseils sur la façon de le réparer? – cvenko

+0

Fait, en lançant toujours la même exception, mais sur la ligne suivante, où j'affecte des valeurs – cvenko

+0

Il n'y a pas de ligne nommée "Vrsta avtomobila", donc il y aura une exception à dr ["Vrsta avtomobila"]. Essayez de déboguer le flux et ajoutez l'objet "dt" à la fenêtre de visualisation, pour voir exactement ce qu'il contient. – Sunny

2

Vous obtenez une erreur, car la session ["tabela"] est vide. Alors insted de ce code:

(DataTable)Session["tabela"] 

Utilisez toujours la propriété en toute sécurité:

public DataTable tabela 
{ 

    get 
    { 
     if(HttpContext.Current.Session["tabela"] == null) 
     { 
      HttpContext.Current.Session["tabela"] = new DataTable ("tableName"); 
     } 
     return HttpContext.Current.Session["tabela"] as DataTable; 
    } 
    set 
    { 
     HttpContext.Current.Session["tabela"] = value; 
    } 
} 

Alors vous ne serez jamais DataTable nulle.

+0

Fait, toujours dans la même erreur – cvenko

+0

@cvenko J'ai essayé votre code et l'exception était sur "dr [" Vrsta avtomobila "]" qui n'existe pas. DataRow dr = dt.NewRow(); fonctionne bien –

Questions connexes