简体   繁体   中英

Cascading Dropdownlist not loaded on SelectedIndexChanged Event

I have two dropdownlists named ddFatherEmployeeNumber and ddEmployeeFatherName. Now on load event i am populating ddFatherEmployeeNumber from database. Here is the code

private DataTable LoadComboBoxFatherEmployeeNumber()
    {
        DataTable dtFatherENo = new DataTable();
        using (SqlConnection con = new SqlConnection(Base.GetConnection))
        {
            using (SqlCommand cmd = new SqlCommand("SELECT Id, EmployeeNo FROM TableFatherMaster", con))
            {
                cmd.CommandType = CommandType.Text;
                con.Open();
                SqlDataReader r = cmd.ExecuteReader();
                dtFatherENo.Load(r);
            }
        }
        return dtFatherENo;
    }

Load Event code is

if (!IsPostBack)
        {
            ddFatherEmployeeNumber.DataSource = LoadComboBoxFatherEmployeeNumber();
            ddFatherEmployeeNumber.DataTextField = "EmployeeNo";
            ddFatherEmployeeNumber.DataValueField = "Id";
            ddFatherEmployeeNumber.DataBind();
            ddFatherEmployeeNumber.Items.Insert(0, new ListItem("Select Father Employee No", "0"));
        }

Here is the .aspx code for ddFatherEmployeeNumber

<div class="col-8">
                                    <asp:DropDownList ID="ddFatherEmployeeNumber" runat="server" class="form-control here" AutoPostBack="True" OnSelectedIndexChanged="ddFatherEmployeeNumber_SelectedIndexChanged"></asp:DropDownList>
                                </div>

Now i want to populate the ddEmployeeFatherName on the bases of ddFatherEmployeeNumber selected value. I mean when a user select employee number from ddFatherEmployeeNumber list then from database, Name of that employee loads and populate the ddEmployeeFatherName. For that purpose i already write a code on ddFatherEmployeeNumber_SelectedIndexChanged Event. Here is the Code.

 protected void ddFatherEmployeeNumber_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (ddEmployeeFatherName.SelectedIndex == 0)
        {

        }
        else
        {
            using (SqlConnection con = new SqlConnection(Base.GetConnection))
            {
                using (SqlCommand cmd = new SqlCommand("SELECT Id, Name FROM TableFatherMaster WHERE EmployeeNo=@EmployeeNo ", con))
                {
                    cmd.CommandType = CommandType.Text;
                    cmd.Parameters.AddWithValue("@EmployeeNo", ddFatherEmployeeNumber.SelectedValue);
                    con.Open();
                    SqlDataReader r = cmd.ExecuteReader();
                    ddEmployeeFatherName.DataSource = r;
                    ddEmployeeFatherName.DataBind();
                }
            }
        }

    }

Now the problem is, it doesn't loads data into ddEmployeeFatherName. Here is the picture for clear understanding 在此处输入图片说明

Try setting DataTextField and DataValueField properties for ddEmployeeFatherName first, because you're not setting them before using DataBind() :

using (SqlConnection con = new SqlConnection(Base.GetConnection))
{
    using (SqlCommand cmd = new SqlCommand("SELECT Id, Name FROM TableFatherMaster WHERE EmployeeNo=@EmployeeNo ", con))
    {
        cmd.CommandType = CommandType.Text;
        cmd.Parameters.AddWithValue("@EmployeeNo", ddFatherEmployeeNumber.SelectedValue);
        con.Open();
        SqlDataReader r = cmd.ExecuteReader();
        ddEmployeeFatherName.DataSource = r;

        // set text and value fields
        ddEmployeeFatherName.DataTextField = "Name";
        ddEmployeeFatherName.DataValueField = "Id";
        ddEmployeeFatherName.DataBind();
    }
}

If the dropdownlist option values are still empty, try loading SqlDataReader contents into DataTable and use it instead:

using (SqlCommand cmd = new SqlCommand("SELECT Id, Name FROM TableFatherMaster WHERE EmployeeNo=@EmployeeNo ", con))
{
    cmd.CommandType = CommandType.Text;
    cmd.Parameters.AddWithValue("@EmployeeNo", ddFatherEmployeeNumber.SelectedValue);
    con.Open();
    SqlDataReader r = cmd.ExecuteReader();

    DataTable dt = new DataTable();
    dt.Load(r);

    ddEmployeeFatherName.DataSource = dt;
    ddEmployeeFatherName.DataTextField = "Name";
    ddEmployeeFatherName.DataValueField = "Id";
    ddEmployeeFatherName.DataBind();
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM