Click here to Skip to main content
15,918,668 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
Hi
When a user order some fruits, he gets to a new page were the inputs is standing. So the user can se what the user have been order and then he could do a confirmation with the contact information.

Before the user is insert the contact information, the user have a choice to make some other options to put to the order.

And when he click on the button the users order information, options and the fruit order could be in the database.

The bekraeft.aspx.cs

C#
public ValgtFrugt frugtKurv;
    public ValgtGroent groentKurv;
    public ValgtDeli deliKurv;
    protected void Page_Load(object sender, EventArgs e)
    {

        if (Session["ValgteFrugter"] != null)
        {
            List<ValgtFrugt> valgteFrugter = (List<ValgtFrugt>)Session["ValgteFrugter"];
            foreach (ValgtFrugt frugt in valgteFrugter)
            {
                //Variablen "frugt" indeholder nu hvert enkelt valgtfrugt objekt og nu kan du gøre sådan:
                Label1.Text += string.Format("{0} ({1} stk.)<br />", frugt.FrugtNavn, frugt.Antal);

            }
            List<ValgtGroent> valgteGroent = (List<ValgtGroent>)Session["ValgteGroent"];
            foreach (ValgtGroent groent in valgteGroent)
            {
                //Variablen "frugt" indeholder nu hvert enkelt valgtfrugt objekt og nu kan du gøre sådan:
                Label1.Text += string.Format("{0} ({1} stk.)<br />", groent.GroentNavn, groent.AntalGroent);

            }
           
        }
        else
        {
           Label1.Text = Session["standard"].ToString();
        }        
    }
    protected void Button_putikurv_Click(object sender, EventArgs e)
    {
        int totalvaerdi = 0;

        List<ValgtDeli> valgteDeli = new List<ValgtDeli>(); //Her laver jeg en liste over valgte frugter. Det er et nyt objekt, som kan indeholde påde ID, Navn, Antal og Værdi

        foreach (RepeaterItem item in VisDeli.Items)
        {
            if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)
            {
                    TextBox TextBox_deli = item.FindControl("TextBox_deli") as TextBox;



                    if (!string.IsNullOrEmpty(TextBox_deli.Text))
                    {

                        opretOrdre();

                    }

                string DeliNavn = TextBox_deli.Attributes["DeliNavn"]; //Det her skal vel være en streng!?

                if (TextBox_deli.Text != null)
                {

                    if (string.IsNullOrEmpty(TextBox_deli.Text))
                    {
                        TextBox_deli.Text = "0";

                    }
                }


                int enkeltDeliAntal = int.Parse(TextBox_deli.Text);


                totalvaerdi += (enkeltDeliAntal);


                if (enkeltDeliAntal > 0)
                {
                    ValgtDeli frugtenDerskalTilfoejes = new ValgtDeli(); //Opret frugten og angiv værdier
                    frugtenDerskalTilfoejes.DeliNavn = DeliNavn;
                    frugtenDerskalTilfoejes.Antal = enkeltDeliAntal;
                    valgteDeli.Add(frugtenDerskalTilfoejes);

                }

            }
            if (totalvaerdi > 0)
            {
                Session["ValgteDeli"] = valgteDeli;
                opretOrdre();
            }

        }
        
    }
    private void opretOrdre()
    {

        SqlConnection conn = new SqlConnection();
        conn.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ToString();

        SqlCommand cmd = new SqlCommand();
        cmd.Connection = conn;
        cmd.CommandText = "INSERT INTO ordre (dato, navn, efternavn, mobil, adresse, mail, postnr, bynavn) VALUES(GETDATE(), @navn, @efternavn, @mobil, @adresse, @mail, @postnr, @bynavn); SELECT SCOPE_IDENTITY()";

        cmd.Parameters.Add("@navn", SqlDbType.VarChar).Value = TextBox_navn.Text;
        cmd.Parameters.Add("@efternavn", SqlDbType.VarChar).Value = TextBox_efternavn.Text;
        cmd.Parameters.Add("@mobil", SqlDbType.VarChar).Value = TextBox_mobil.Text;
        cmd.Parameters.Add("@adresse", SqlDbType.VarChar).Value = TextBox_adresse.Text;
        cmd.Parameters.Add("@mail", SqlDbType.VarChar).Value = TextBox_mail.Text;
        cmd.Parameters.Add("@postnr", SqlDbType.VarChar).Value = TextBox_postnr.Text;
        cmd.Parameters.Add("@bynavn", SqlDbType.VarChar).Value = TextBox_by.Text;

        conn.Open();
        object orderId = cmd.ExecuteScalar();
        conn.Close();
        
        cmd.Parameters.Add("@fk_ordre", SqlDbType.Int).Value = orderId;
        cmd.Parameters.Add("@fk_frugt_id", SqlDbType.Int).Value = 0;
        cmd.Parameters.Add("@fk_deli_id", SqlDbType.Int).Value = 0;
        cmd.Parameters.Add("@fk_groent_id", SqlDbType.Int).Value = 0;
        cmd.Parameters.Add("@Antal", SqlDbType.Int).Value = 0;
        
        cmd.Parameters.Add("@frugt_id", SqlDbType.VarChar).Value = 0;
        cmd.Parameters.Add("@deli_id", SqlDbType.VarChar).Value = 0;
        cmd.Parameters.Add("@groent_id", SqlDbType.VarChar).Value = 0;

        DataTable dt = (DataTable)Session["ValgteFrugter"];
        DataTable dt1 = (DataTable)Session["ValgteGroent"];
        DataTable dt2 = (DataTable)Session["ValgteDeli"];
        
        DataTable dtAll = new DataTable();
        dtAll = dt.Copy();
        dtAll.Merge(dt1, true);
        dtAll.Merge(dt2, true);

                conn.Open();

        foreach (DataRow row in dtAll.Rows)
        {
            cmd.CommandText = @"INSERT INTO ordre_linie 
                                (fk_ordre_id, fk_frugt_id, fk_deli_id, fk_groent_id, antal) 
                                VALUES (@fk_ordre, @fk_frugt_id, @fk_deli_id, @fk_groent_id, @Antal)";

            cmd.Parameters["@fk_frugt_id"].Value = row["FrugtNavn"];
            cmd.Parameters["@fk_deli_id"].Value = row["DeliNavn"];
            cmd.Parameters["@fk_groent_id"].Value = row["GroentNavn"];
            cmd.Parameters["@Antal"].Value = row["Antal"];           

            cmd.ExecuteNonQuery();
        }
       
        conn.Close();
        Session.Abandon();
        Response.Redirect("tak.aspx");      
       
    }

    protected void VisDeli_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            TextBox TextBox_deli = e.Item.FindControl("TextBox_deli") as TextBox;

            if (TextBox_deli == null) return;

            TextBox_deli.Attributes.Add("DeliID", string.Format("{0}", ((DataRowView)(e.Item.DataItem)).Row["deli_id"])); //Læg en ny attribut på TextBoxen der peger på frugtens unikke ID.  
            TextBox_deli.Attributes.Add("DeliNavn", string.Format("{0}", ((DataRowView)(e.Item.DataItem))["deli_navn"])); //Læg en ny attribut på TextBoxen der peger på vaerdi.          
            
        }
    }


When I click on the button, I get this Error:

Unable to cast object of type 'System.Collections.Generic.List`1[ValgtFrugt]' to type 'System.Data.DataTable

Line 164:
Line 165:
Line 166: DataTable dt = (DataTable)Session["ValgteFrugter"];
Line 167: DataTable dt1 = (DataTable)Session["ValgteGroent"];
Line 168: DataTable dt2 = (DataTable)Session["ValgteDeli"];

Hope someone could help me?

/Tina
Posted
Comments
Ankur\m/ 15-Oct-13 8:56am    
The value you stored in the Session["ValgteFrugter"] is of type GenericList. While getting the value you are assigning it to a DataTable which is an invalid cast.
tina_overgaard 15-Oct-13 9:06am    
How do I get the cast to a datatable? Or can I use the genericList to get the session information into database?
Ankur\m/ 15-Oct-13 9:18am    
Please see my answer.

1 solution

The value you stored in the Session["ValgteFrugter"] is of type Generic List[^]. While getting the value you are assigning it to a DataTable which is an invalid cast.

You will have to convert it to a DataTable first. Extension method CopyToDataTable[^] may be useful or you may loop through the list manually to create a DataTable.
 
Share this answer
 
v2
Comments
Ankur\m/ 15-Oct-13 9:19am    
You may also refer http://stackoverflow.com/questions/15004207/convert-generic-list-to-datatable-using-linq
which talks about how to convert generic list to a DataTable.
tina_overgaard 15-Oct-13 9:47am    
Is it something like this:

var FrugtList = new List<valgtfrugt>();
var dataTable = new DataTable();

dataTable.Columns.Add("FrugtID", typeof(int));
dataTable.Columns.Add("FrugtNavn", typeof(string));
dataTable.Columns.Add("Antal", typeof(int));
dataTable.Columns.Add("FrugtVaerdi", typeof(int));


foreach (var FrugtList in ValgtFrugt)
{
dataTable.Rows.Add(ValgtFrugt.FrugtID, ValgtFrugt.FrugtNavn, ValgtFrugt.Antal, ValgtFrugt.FrugtVaerdi)
}
Ankur\m/ 15-Oct-13 9:56am    
Yes that should work. You don't need the first line [var FrugtList = new List();] though.
tina_overgaard 15-Oct-13 9:56am    
How do I get all the datatable merge to one? I need a little more help
Ankur\m/ 15-Oct-13 9:57am    
Do all of them have same columns?

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900