Q:

Receiving the error "ExecuteReader requires an open and available Connection. The connection's current state is closed." when running my application

I am trying to display some values in textboxes from a database by selecting a site ID from a drop down list. The drop down list is working perfectly and showing the site IDs that are stored in the database. While running this application it shows an error:

Execute Reader requires an open and available Connection. The connection's current state is closed. 

Code:
protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            LoadOption();
        }
    }

 private void LoadOption()
    {
        DataTable dt = new DataTable();
        SqlConnection con = new SqlConnection(@"connectionString");
        using (con)
        {
            SqlDataAdapter adpt = new SqlDataAdapter("SELECT Site_ID FROM tbl_Survey1", con);
            adpt.Fill(dt);
            ddlSiteID.DataSource = dt;
            ddlSiteID.DataTextField = "Site_ID";
            ddlSiteID.DataValueField = "Site_ID";
            ddlSiteID.DataBind();
            ddlSiteID.Items.Insert(0, new ListItem("--Select ID--", ""));
        }
    }
 protected void ddlSiteID_SelectedIndexChanged(object sender, EventArgs e)
    {
 SqlConnection con = new SqlConnection(@"connectionString");
 string selectID = ddlSiteID.SelectedValue;
 SqlCommand cmd = new SqlCommand("SELECT Site_Name,Site_Address FROM tbl_Survey1 where Site_ID=@Site_ID", con);
        cmd.Parameters.AddWithValue("@Site_ID", selectID);
        cmd.CommandType = CommandType.Text;
        using (SqlDataReader rdr = cmd.ExecuteReader())
        {
            if (rdr.HasRows)
            {
                rdr.Read();
                txtSiteName.Text = rdr.GetString(0);
                txtSiteAddress.Text=rdr.GetString(1);
            }
       }
    }
}

Source:
<asp:DropDownList ID="ddlSiteID" runat="server" AutoPostBack="True" OnSelectedIndexChanged="ddlSiteID_SelectedIndexChanged">
                    </asp:DropDownList>

 <asp:TextBox ID="txtSiteName" runat="server"></asp:TextBox>

 <asp:TextBox ID="txtSiteAddress" runat="server"></asp:TextBox>

A:

The error explains all. Your connection is closed when you call ExecuteReader. But I suppose that you are asking why?.
You think that, because you have already loaded the dropdown, then you could execute your reader without problems. But, unfortunately, the SqlDataAdapter has its own behavior when working with the connection. 
From MSDN SqlDataAdapter.Fill

The Fill method retrieves rows from the data source using the SELECT
  statement specified by an associated SelectCommand property. The
  connection object associated with the SELECT statement must be valid,
  but it does not need to be open. If the connection is closed before
  Fill is called, it is opened to retrieve data, then closed. If the
  connection is open before Fill is called, it remains open.

So you just need to open the connection in this way
protected void ddlSiteID_SelectedIndexChanged(object sender, EventArgs e)
{
   string selectID = ddlSiteID.SelectedValue;
   using(SqlConnection con = new SqlConnection(@"connectionString"))
   using(SqlCommand cmd = new SqlCommand("SELECT Site_Name,Site_Address FROM tbl_Survey1 where Site_ID=@Site_ID", con))
   {
       con.Open();
       cmd.Parameters.AddWithValue("@Site_ID", selectID);
       cmd.CommandType = CommandType.Text;
       using (SqlDataReader rdr = cmd.ExecuteReader())
       {
          ....
       }
    }
 }

P.S. Remember to keep always your disposable objects like the connection, command and reader inside an Using block to be sure that they are closed and disposed correctly also in case of exceptions

A:

You're missing in the second method an explicit call to open your connection:
con.Open();

Also, you don't dispose of said connection -- be careful with that. Use usings for anything that implements IDisposable:
protected void ddlSiteID_SelectedIndexChanged(object sender, EventArgs e)
{
    using (SqlConnection con = new SqlConnection(@"connectionString"))
    {
        con.Open();
        string selectID = ddlSiteID.SelectedValue;
        using (SqlCommand cmd = new SqlCommand("SELECT Site_Name,Site_Address FROM tbl_Survey1 where   Site_ID=@Site_ID", con))
        {
            cmd.Parameters.AddWithValue("@Site_ID", selectID);
            cmd.CommandType = CommandType.Text;
            using (SqlDataReader rdr = cmd.ExecuteReader())
            {
                if (rdr.HasRows)
                {
                    rdr.Read();
                    txtSiteName.Text = rdr.GetString(0);
                    txtSiteAddress.Text=rdr.GetString(1);
                }
            }
        }
    }
}

A:

You should open your connection by calling con.Open() before calling ExecuteReader in ddlSiteID_SelectedIndexChanged method. And don't forget to close it in the end.
This means your code may look like 
protected void ddlSiteID_SelectedIndexChanged(object sender, EventArgs e)
{
    using(var con = new SqlConnection(@"connectionString"))
    {
        string selectID = ddlSiteID.SelectedValue;
        using (var cmd = new SqlCommand("SELECT Site_Name,Site_Address FROM tbl_Survey1 where Site_ID=@Site_ID", con))
        {
            cmd.Parameters.AddWithValue("@Site_ID", selectID);
            cmd.CommandType = CommandType.Text;

            con.Open();
            try
            {
                using (SqlDataReader rdr = cmd.ExecuteReader())
                {
                    if (rdr.HasRows)
                    {
                        rdr.Read();
                        txtSiteName.Text = rdr.GetString(0);
                        txtSiteAddress.Text=rdr.GetString(1);
                    }
               }
           }
           finally
           {
                con.Close();
           }
       }
    }
}

