【问题标题】:Cascading Dropdownlist not loaded on SelectedIndexChanged Event未在 SelectedIndexChanged 事件上加载级联下拉列表
【发布时间】:2018-12-27 09:43:08
【问题描述】:

我有两个名为 ddFatherEmployeeNumber 和 ddEmployeeFatherName 的下拉列表。现在在加载事件时,我正在从数据库中填充 ddFatherEmployeeNumber。这是代码

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;
    }

加载事件代码是

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

这里是 ddFatherEmployeeNumber 的 .aspx 代码

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

现在我想在 ddFatherEmployeeNumber 选定值的基础上填充 ddEmployeeFatherName。我的意思是当用户从 ddFatherEmployeeNumber 列表然后从数据库中选择员工编号时,该员工的姓名会加载并填充 ddEmployeeFatherName。为此,我已经在 ddFatherEmployeeNumber_SelectedIndexChanged 事件上编写了代码。这是代码。

 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();
                }
            }
        }

    }

现在的问题是,它不会将数据加载到 ddEmployeeFatherName。 这是为了清楚理解的图片

【问题讨论】:

  • ddEmployeeFatherName.DataSource = r => 此行尝试直接从阅读器加载数据源,阅读器完成后可能返回空结果。尝试使用FatherNameDataTable.Load(r) 将阅读器投射到另一个DataTable 并查看结果。您也应该尝试为DataTextFieldDataValueField 设置列名。
  • 我也是这样做的,但问题是,第一次加载数据,但是当页面回发时,它没有再次加载,而是显示旧值,我的意思是旧名称第一次加载。虽然我正在清理物品。我在 SelectedIndexChanged 事件 ddEmployeeFatherName.Items.Clear(); ddEmployeeFatherName.DataSource = LoadComboBoxFatherEmployeeName(); ddEmployeeFatherName.DataBind(); 中添加了这段代码 sn-p

标签: c# asp.net .net webforms


【解决方案1】:

首先尝试为ddEmployeeFatherName 设置DataTextFieldDataValueField 属性,因为您在使用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();
    }
}

如果下拉列表选项值仍然为空,请尝试将 SqlDataReader 内容加载到 DataTable 并改用它:

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();
}

【讨论】:

  • 但是我已经在 .aspx 代码中设置了DataTextField and DataValueField。`&lt;asp:DropDownList ID="ddEmployeeFatherName" runat="server" DataTextField="Name" DataValueField="Id" class="form-control here" Enabled="false"&gt;&lt;/asp:DropDownList&gt; 我认为这不是问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多