Search code examples
c#asp.netdatalistradiobuttonlist

Null Reference Exception of RadioButtonList value


I have a DataList that Displays some Posts with a RadioButtonList inside where it contains 5 choices from 1 to 5, however when i try to get the selected value of theRadioButtonList, it throws Null Exception, thats my code: error @ string choice = RadioButtonList1.SelectedItem.Value;

protected void RadioButtonList1_SelectedIndexChanged(object sender, EventArgs e)
        {
            foreach (DataListItem item in DataList2.Items)
            {
                RadioButtonList RadioButtonList1 = (RadioButtonList)DataList2.FindControl("RadioButtonList1");
                string choice = RadioButtonList1.SelectedItem.Value;
                Label post_IDLabel = (Label)item.FindControl("post_IDLabel");
                int post_ID = Convert.ToInt32(post_IDLabel.Text);
                int value = Convert.ToInt32(choice.ToString());
                string connStr = ConfigurationManager.ConnectionStrings["MyDbConn"].ToString();
                SqlConnection conn = new SqlConnection(connStr);
                SqlCommand cmd = new SqlCommand("rate", conn);
                cmd.CommandType = CommandType.StoredProcedure;
                string email = Session["email"].ToString();
                int course_ID = Convert.ToInt32(Request.QueryString["courseID"]);
                cmd.Parameters.Add(new SqlParameter("@course_ID", course_ID));
                cmd.Parameters.Add(new SqlParameter("@postID", post_ID));
                cmd.Parameters.Add(new SqlParameter("@myemail", email));
                cmd.Parameters.Add(new SqlParameter("@rate", value));
                conn.Open();
                cmd.ExecuteNonQuery();
                conn.Close();
                Response.Write(choice);
            }
            DataList2.DataBind();
        }

that's the error:

Object reference not set to an instance of an object.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Solution

  • I suspect your issue is with those radiobuttonlists that do not have a value selected. When this is the case selecteditem will be null, but you are not testing for this.

    Here is a rewrite that also fixes potential issues with the connections and commands not being disposed and of excessive opening and closing of the connection:

        protected void RadioButtonList1_SelectedIndexChanged(object sender, EventArgs e)
        {
            string connStr = ConfigurationManager.ConnectionStrings["MyDbConn"].ToString();
            using (SqlConnection conn = new SqlConnection(connStr))
            {
                using (SqlCommand cmd = new SqlCommand("rate", conn))
                {
                    cmd.CommandType = System.Data.CommandType.StoredProcedure;
                    cmd.Parameters.Add("@course_ID", System.Data.SqlDbType.Int);
                    cmd.Parameters.Add("@postID", System.Data.SqlDbType.Int);
                    cmd.Parameters.Add("@myemail", System.Data.SqlDbType.Int);
                    cmd.Parameters.Add("@rate", System.Data.SqlDbType.VarChar);
                    conn.Open();
    
                    foreach (DataListItem item in DataList2.Items)
                    {
                        RadioButtonList RadioButtonList1 = (RadioButtonList)DataList2.FindControl("RadioButtonList1");
                        if (RadioButtonList1.SelectedItem != null)
                        {
                            string choice = RadioButtonList1.SelectedItem.Value;
                            Label post_IDLabel = (Label)item.FindControl("post_IDLabel");
    
                            cmd.Parameters["@course_ID"].Value = Convert.ToInt32(Request.QueryString["courseID"]);
                            cmd.Parameters["@postID"].Value = Convert.ToInt32(post_IDLabel.Text);
                            cmd.Parameters["@myemail"].Value = Session["email"] as string;
                            cmd.Parameters["@rate"].Value = Convert.ToInt32(RadioButtonList1.SelectedItem.Value);
    
                            cmd.ExecuteNonQuery();
                            Response.Write(choice);
                        }
                    }
                }
            }
            DataList2.DataBind();
        }