ASP.NET Webforms 问题 --- 选择项目后下拉列表不保存值

问题描述 投票:0回答:1

我有 3 个下拉列表,第一个下拉列表“产品下拉列表”根据所选项目填充第二个下拉列表“类别下拉列表”,第二个下拉列表根据所选值填充第三个下拉列表“部分下拉列表”,但问题是每当我从第二个下拉列表中选择该项目,它完美地填充了第三个下拉列表,即部分下拉列表,但它不保存自己选定的项目,并且第二个下拉列表将自身更改为第三个下拉列表,即部分下拉列表。这意味着从第二个下拉列表中选择项目后,零件下拉列表的总数变为两个。

产品下拉列表

<asp:DropDownList id="slctproduct" runat="server" name="select" class="form-control form- 
control-primary"  onchange="selectcategory(); return false;"> </asp:DropDownList>

类别下拉菜单

<asp:DropDownList id="slctpartcategory" runat="server" class="form-control form-control- 
 primary" onchange="selectpart(); return false;" ></asp:DropDownList>

部分下拉菜单

 <asp:DropDownList id="slctpart" runat="server" name="select" class="form-control form 
 control-primary" ></asp:DropDownList>

根据产品下拉列表中所选项目填充类别下拉列表的代码

function selectcategory() {
    var product = document.getElementById('<%= slctproduct.ClientID %>');
    // Fetch and populate part categories based on the selected product
    $.ajax({
        type: "POST",
        url: "RNI_Agent_PartStockReport.aspx/RNI_Fetch_PartCategoryForCN",
        data: "{ 'P': { 'RNI_FK_CN_PartCategory': '" + product.value + "' } }",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (r) {
            var ddlProducts2 = $("[id*=slctpartcategory]");
            ddlProducts2.empty().append('<option selected="selected" value="-1">Select Part Category</option>');
            $.each(r.d, function () {
                ddlProducts2.append($("<option></option>").val(this['Value']).html(this['Text']));
            });
        }
    });

 
}

下面的代码是写在文件(aspx.cs)后面的代码中

public static List<ListItem> RNI_Fetch_PartCategoryForCN(Properties P)
{
    using (cmd = new SqlCommand())
    {
        List<ListItem> type = new List<ListItem>();
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = "sp_Fetch_PartcategoryForCN";
        cmd.Connection = Getconnected.getconnecting();
        cmd.Parameters.AddWithValue("@Product", P.RNI_FK_CN_PartCategory);
        //cmd.Parameters.AddWithValue("@category", P.RNI_FK_SelectedPartCategory); 
        using (sdr = cmd.ExecuteReader())
        {
            while (sdr.Read())
            {

                type.Add(new ListItem
                {

                    Value = sdr[0].ToString(),
                    Text = sdr[1].ToString()
                });
            }
        }

        return type;
    }
}

根据类别下拉列表的所选项目填充部分下拉列表的代码

function selectpart() {


    var partcategory = document.getElementById('<%= slctpartcategory.ClientID %>');
   
    // Check if any of the inputs are empty or null

    $.ajax({
        type: "POST",
        url: "RNI_Agent_PartStockReport.aspx/RNI_Fetch_Part",
        data: "{ 'P': { 'FK_Part': '" + partcategory.value + "' } }",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (r) {
            var ddlProducts = $("[id*=slctpart]");
            ddlProducts.empty().append('<option selected="selected" value="-1">Select Part</option>');
            $.each(r.d, function () {
                ddlProducts.append($("<option></option>").val(this['Value']).html(this['Text']));
            });
           
          
        }
    });
  
    

}

下面的代码是写在文件(aspx.cs)后面的代码中

[WebMethod]
public static List<ListItem> RNI_Fetch_Part(Properties P)
{
    using (cmd = new SqlCommand())
    {
        List<ListItem> type = new List<ListItem>();
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = "sp_Fetch_PartsfromCategory";
        cmd.Connection = Getconnected.getconnecting();
        cmd.Parameters.AddWithValue("@category", P.FK_Part);
        using (sdr = cmd.ExecuteReader())
        {
            while (sdr.Read())
            {

                type.Add(new ListItem
                {

                    Value = sdr[0].ToString(),
                    Text = sdr[1].ToString()
                });
            }
        }

        return type;
    }
}
asp.net webforms dropdown
1个回答
0
投票

请记住,在任何回发中,页面加载事件都会在代码存根之前触发。因此,如果页面加载中有填充组合框的代码,那么在重新绑定 3 个组合框中的任何一个时,用户的选择将被覆盖。

这意味着您无法重新绑定组合框,因为这样做会丢失当前的选择。在大多数情况下,这实际上是所需的行为,因为如果用户更改组合 2,则组合 3 将级联,并且重新绑定组合 3 的“行为”也意味着组合 3 失去当前选择(并且它应该无论如何)。

对于组合 1 选择也是如此,它现在必须级联组合 2,(选择丢失),当发生这种情况时,您可能应该吹掉(清除)组合 3 选择和数据源。

因此,在“真实”和“第一”页面加载时,您将填写组合 1,组合 2、3 将为空。

现在,上面当然假设服务器端代码,自动回发。

但是,随着 Web 方法的引入,会出现一些警告,因为组合框没有视图状态,也没有回发。

但是,只要您不重新加载现有组合框的数据源,就应该没问题。因此,组合 2 的更改不仅应该重新加载组合 3,而且当然还要在重新加载(级联)组合 3 之前清除组合 3 选择。

因此,检查您的页面加载事件。您几乎总是需要将第一个组合 1 加载代码放置在所有重要的 !IsPostBack 代码存根中。

例如这个:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            LoadData();
    }

    void LoadData()
    {
        string strSQL =
            @"SELECT * FROM tblHotelsA ORDER BY HotelName";

        cboHotels.DataSource = General.MyRst(strSQL);
        cboHotels.DataBind();
        cboHotels.Items.Insert(0, "Select Hotel");

    }

因此,您不会显示页面加载事件,但请记住,如果没有 !IsPostBack 代码存根,那么在任何回发中,如果存在在页面加载中重新加载组合框的代码,它将丢失当前的组合框该组合框的选择。但是,使用 !IsPostBack 代码存根,我们并不关心页面加载事件在任何页面回发时触发,因为我们只在“真正的”首页加载时运行该代码。

此外,您可以转储 ajax,并将 3 个组合放置在更新面板中。然而,毫无疑问,额外的努力并使用 ajax 来填写组合是一条更好的道路,但与 100% 服务器端代码相比,这会带来很多额外的工作。

© www.soinside.com 2019 - 2024. All rights reserved.