Click here to Skip to main content
15,886,035 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
Hi
I have this table with som fruit, and when the user insert a number for how many fruits they want in a textbox. And when the user click on the button it will check if there is 7 fruits in the basket and go to the confirmation page. But I get this error everytime i try.

Value cannot be null.
Parameter name: String

Line 96: int enkeltFrugtVaerdi = int.Parse(Textbox_antal.Attributes["FrugtVaerdi"]);

Heres my code on Default.aspx

C#
<table border="1">
           
            <tr>
                <td>Antal</td>
                <td><asp:Label ID="Label1" runat="server" Text=""></asp:Label></td>
            </tr>
            <asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound">
                <ItemTemplate>

            
            <tr>
                <td><%#Eval("frugt_navn") %></td>
                <td><asp:TextBox ID="txtbox1" runat="server" Width="30"></asp:TextBox></td>
                
                    <asp:HiddenField ID="HiddenField1" runat="server" />
                
            </tr>
           
    </ItemTemplate>
            </asp:Repeater>
        </table>
    
    <asp:Button ID="Button1" runat="server" Text="Læg i kurv" OnClick="Button1_Click1" /> 
        <asp:Label ID="Label_vis" runat="server" Text=""></asp:Label>


Default.aspx.cs

C#
public ValgtFrugt frugtKurv;
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack) //Hvis det er en PostBack (knappen er trykket), så skal data ikke bindes igen.
        {
            
            Repeater1.DataSource = MakeMockTable();
            Repeater1.DataBind();
        }
    }
 private static DataTable MakeMockTable() //Bare nogle test-data.  Du får dem jo fra databasen
    {


        DataTable worktbl = new DataTable();
        worktbl.Columns.Add("frugt_id", typeof(int));
        worktbl.Columns.Add("vaerdi", typeof(int));
        worktbl.Columns.Add("frugt_navn", typeof(string));

        DataRow workRow = worktbl.NewRow();
        workRow["frugt_id"] = 0;
        workRow["vaerdi"] = 1;
        workRow["frugt_navn"] = "Banan";
        worktbl.Rows.Add(workRow);
        workRow = worktbl.NewRow();
        workRow["frugt_id"] = 1;
        workRow["vaerdi"] = 1;
        workRow["frugt_navn"] = "Æble";
        worktbl.Rows.Add(workRow);
        workRow = worktbl.NewRow();
        workRow["frugt_id"] = 2;
        workRow["vaerdi"] = 1;
        workRow["frugt_navn"] = "Blomme";
        worktbl.Rows.Add(workRow);
        workRow = worktbl.NewRow();
        workRow["frugt_id"] = 3;
        workRow["vaerdi"] = 7;
        workRow["frugt_navn"] = "Melon";
        worktbl.Rows.Add(workRow);
        return worktbl;
    }
    protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            TextBox Textbox_antal = FindControl("txtbox1") as TextBox;
            if (Textbox_antal == null) return;

            Textbox_antal.Attributes.Add("FrugtID", string.Format("{0}", ((DataRow)e.Item.DataItem)["frugt_id"])); //Læg en ny attribut på TextBoxen der peger på frugtens unikke ID.  
            Textbox_antal.Attributes.Add("FrugtVaerdi", string.Format("{0}", ((DataRow)e.Item.DataItem)["vaerdi"])); //Læg en ny attribut på TextBoxen der peger på vaerdi.
            Textbox_antal.Attributes.Add("FrugtNavn", string.Format("{0}", ((DataRow)e.Item.DataItem)["frugt_navn"])); //Læg en ny attribut på TextBoxen der peger på vaerdi.

        }
    }
    protected void Button1_Click1(object sender, EventArgs e)
    {
        int totalvaerdi = 0;
        List<ValgtFrugt> valgteFrugter = new List<ValgtFrugt>(); //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 Repeater1.Items)
        {
            if (item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)
            {
                TextBox Textbox_antal = item.FindControl("txtbox1") as TextBox;
                if (Textbox_antal == null) continue; //Tekstboksen blev ikke fundet, så ingen grund til at lave mere her.

                string frugtNavn = Textbox_antal.Attributes["FrugtNavn"]; //Det her skal vel være en streng!?
                int enkeltFrugtVaerdi = int.Parse(Textbox_antal.Attributes["FrugtVaerdi"]);
                int enkeltFrugtAntal = int.Parse(Textbox_antal.Text);

                totalvaerdi += (enkeltFrugtVaerdi * enkeltFrugtAntal);

                if (enkeltFrugtAntal > 0)
                {
                    ValgtFrugt frugtenDerskalTilfoejes = new ValgtFrugt(); //Opret frugten og angiv værdier
                    frugtenDerskalTilfoejes.FrugtNavn = frugtNavn;
                    frugtenDerskalTilfoejes.FrugtVaerdi = enkeltFrugtVaerdi;
                    frugtenDerskalTilfoejes.Antal = enkeltFrugtAntal;
                    valgteFrugter.Add(frugtenDerskalTilfoejes);
                }
            }
        }

        if (totalvaerdi == 7) //Det her skal vel være "Mindre end" eller lig 7, for ellers kan du bestille over 7 frugter
        {
            Session["ValgteFrugter"] = valgteFrugter; //Her lægger jeg dem bare i en session-variabel, så kan jeg lægge dem ind i databasen når det er bekræftet.
            Response.Redirect("bekraeft.aspx");

        }
        else
        {

            Label_vis.Text = "Du kan kun bestille 7 stk frugt";
        }
    }


bekraeft.aspx

C#
<asp:Label ID="Label1" runat="server" Text=""></asp:Label>


bekraeft.aspx.cs

C#
public ValgtFrugt frugtKurv;
   protected void Page_Load(object sender, EventArgs e)
   {
       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.)", frugt.FrugtNavn, frugt.Antal);
       }
   }


ValgtFrugt.cs
C#
public class ValgtFrugt
{

    public int FrugtID { get; set; }
    public string FrugtNavn { get; set; }
    public int Antal { get; set; }
    public int FrugtVaerdi { get; set; }

}


Hope someone could help me
Posted
Comments
CodeBlack 10-Oct-13 8:23am    
where is your textbox 'Textbox_antal'
tina_overgaard 10-Oct-13 8:24am    
This is the one <asp:TextBox ID="txtbox1" runat="server" Width="30">

Its in a repeater

Update your Repeater1_ItemDataBound as mentioned below. It will solve your problem :


C#
protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
       {
           if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
           {
               TextBox Textbox_antal = e.Item.FindControl("txtbox1") as TextBox;
               if (Textbox_antal == null) return;

               Textbox_antal.Attributes.Add("FrugtID", string.Format("{0}", DataBinder.Eval(e.Item.DataItem, "frugt_id"))); 
               Textbox_antal.Attributes.Add("FrugtVaerdi", string.Format("{0}",DataBinder.Eval(e.Item.DataItem, "vaerdi"))); 
               Textbox_antal.Attributes.Add("FrugtNavn", string.Format("{0}", DataBinder.Eval(e.Item.DataItem, "frugt_navn"))); 

           }
       }
 
Share this answer
 
v2
Comments
tina_overgaard 10-Oct-13 9:10am    
It comes with this error now.

Input string was not in a correct format.

Line 81: int enkeltFrugtAntal = int.Parse(Textbox_antal.Text);
tina_overgaard 10-Oct-13 9:10am    
When I look on Default.aspx page there is no any values

<tr>
<td>Banan</td>
<td><input name="Repeater1$ctl100$txtbox1" type="text" id="Repeater1_txtbox1_0"></td>
<input type="hidden= name="Repeater1$ctl100$HiddenField1" id="Repeater1_HiddenField1_0">


</tr>
CodeBlack 10-Oct-13 9:13am    
because you have not validated it. validate your textbox whether entered data is integer or not.
CodeBlack 10-Oct-13 9:18am    
int.Parse(Textbox_antal.Text);

here you check text value to the integer. and if text box is blank or non integer number then it will not be able to convert to the integer. So restrict user to enter only numbers. so that your code can convert text value to integer.
tina_overgaard 10-Oct-13 10:22am    
Thank you very much!!!!! I inserted this one
if (Textbox_antal != null)
{
if(string.IsNullOrEmpty(Textbox_antal.Text))
{
Textbox_antal.Text = "0";
}
}
Hey there,

I replicated your scenario and there were multiple problems in Repeater1_ItemDataBound event's code:

Here is a modified version, it'll work:

C#
protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                TextBox Textbox_antal = e.Item.FindControl("txtbox1") as TextBox;
                if (Textbox_antal == null) return;

                Textbox_antal.Attributes.Add("FrugtID", string.Format("{0}", ((DataRowView)(e.Item.DataItem)).Row["frugt_id"])); //Læg en ny attribut på TextBoxen der peger på frugtens unikke ID.  
                Textbox_antal.Attributes.Add("FrugtVaerdi", string.Format("{0}", ((DataRowView)(e.Item.DataItem))["vaerdi"])); //Læg en ny attribut på TextBoxen der peger på vaerdi.
                Textbox_antal.Attributes.Add("FrugtNavn", string.Format("{0}", ((DataRowView)(e.Item.DataItem))["frugt_navn"])); //Læg en ny attribut på TextBoxen der peger på vaerdi.

            }
        }


First, findControl() wasn't used in the right way and second, approach to get DataItem values was not correct.

Let me know if it helps.

Azee...
 
Share this answer
 
Comments
tina_overgaard 10-Oct-13 9:03am    
It comes with this error now.

Input string was not in a correct format.

Line 81: int enkeltFrugtAntal = int.Parse(Textbox_antal.Text);
tina_overgaard 10-Oct-13 9:04am    
When I look on Default.aspx page there is no any values

<tr>
<td>Banan</td>
<td><input name="Repeater1$ctl100$txtbox1" type="text" id="Repeater1_txtbox1_0"></td>
<input type="hidden= name="Repeater1$ctl100$HiddenField1" id="Repeater1_HiddenField1_0">


</tr>

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