0

对于我的应用程序,我需要合并一些下拉列表,以便根据这些列表中选择的不同值显示一些表格。但是当我在一个列表中选择一个值时,另一个填充该值的函数,我不知道该怎么做。

在我的应用程序中,我只使用这样的原始查询:

        string requeteAppli ="select distinct CD_APPLI, ORDRE_APPLI from dbo.REF_APPLI where CD_APPLI != 'PNB' order by ORDRE_APPLI";

使用这样的函数执行它们:

public List<DataRow> executerRequete(string query)
    {
        //Initialisation d'une variable Liste contenant des lignes de données où seront récupérés les résultats de la requête suivante.
        List<DataRow> liste = null;

        //Création d'une variable de connection où sont stockés toutes les informations nécessaires à la connexion à la base de données.
        //Ces informations sont stockées dans le fichier de config Web.config.
        string connString = ConfigurationManager.AppSettings["REF_ConnectionString"];

        //Création d'un objet instance de SqlConnection (classe permettant la connexion ouverte à une base de données) où est stocké le contenu de la variable connString.
        using (SqlConnection conn = new SqlConnection(connString))
        {
            //Création d'un objet de commande permettant de spécifier comment la commande sera inteprétée, ici en commande de texte SQL avec CommandType.Text.
            using (SqlCommand objCommand = new SqlCommand(query, conn))
            {
                //Création d'un objet de commande permettant de spécifier comment la commande sera inteprétée, ici en commande de texte SQL avec CommandType.Text.
                objCommand.CommandType = CommandType.Text;
                //Création d'un objet instance de DataTable qui va récupérer la résultat de la requête.
                DataTable dt = new DataTable();
                //Création d'un objet instance de SqlDataAdapter qui va effectuer le lien avec SQL Server afin de récupérer les données.
                SqlDataAdapter adp = new SqlDataAdapter(objCommand);
                //Ouverture de la connexion.
                conn.Open();
                //L'instruction FILL récupère les données de la source de données et les insère dans dt.
                adp.Fill(dt);
                //Vérification du contenu de dt.
                if (dt != null)
                {
                    //Remplissage de la liste.
                    liste = dt.AsEnumerable().ToList();
                }
            }
        }

        //Le résultat est retournée à l'action.
        return liste;
    }

问题出在这些查询上,我看过很多关于如何使用 ASP.NET MVC 和 jQuery 实现级联下拉列表的教程,但它不是这种查询风格,我完全对它们感到困惑,我不能改变它们。

我在这样的操作中得到了这些查询的结果:

var queries = new query();
var items = rq.executerRequete(requeteIndex);
queries.Query2 = (from i in items2
                  select new Suivi { CD_APPLI = i.Field<String>("CD_APPLI") }).ToList();

我的目标是拥有第一个应用程序列表,当用户选择一个值时,另一个包含某个日期(取决于所选应用程序)的列表填充功能。这是获取所选应用程序功能日期的查询:

var itemsDate = rq.executerRequete(requetePERIODE);
var periode = (from i in itemsDate
               where i.Field<String>("CD_APPLI").Trim() == appli.Trim()
               select new Suivi { PERIODE = i.Field<Int64>("PERIODE") });

我完全迷失了这些级联下拉列表,我真的需要你的帮助:/如果你需要代码,我可以给你这个,但即使我已经为这些列表尝试了一些解决方案,我也不能给你一个我的例子代码(javascript)因为它根本不起作用而且我做任何事情,我的代码只是很多废话......

4

3 回答 3

2

服务器端,您使用应用程序 ID 和要显示的内容填充应用程序下拉列表

客户端,您需要在第一个下拉列表的更改事件上附加一个函数以获取数据并填写日期下拉列表,例如

    $(document).ready(function(){
     $('#CboApplications').change(function() {
      function getDates() {
      $.ajax({
          type: "POST",
          url: "Reg_Form.aspx/GetDates",
          data: "{'applicationId':" + ( $('#CboApplications').val()) + "}",
          contentType: "application/json; charset=utf-8",
          global: false,
          async: false,
          dataType: "json",
          success: function(jsonObj) {
             for (var i = 0; i < jsonObj.Table.length; i++){
               listItems+= "<option value='" + jsonObj.Table[i].PERIODE+ "'>" + jsonObj.Table[i].PERIODE+ "</option>";
              }
             $("#cboDates").html(listItems);
        }
    });
    return false;
}
    });

要获取数据,您将需要一个 Web 方法或一个带有执行查询代码的 Web 方法的 Web 服务

<WebMethod()> _
Public Sub GetDates(ByVal applicationId As String)
    //use correct qry based on applicationId 
    var itemsDate = rq.executerRequete(requetePERIODE);
    var periode = (from i in itemsDate
           where i.Field<String>("CD_APPLI").Trim() == appli.Trim()
           select new Suivi { PERIODE = i.Field<Int64>("PERIODE") });
    Return periode 
End Sub

此代码不会 100% 正确,因为我无法自己在 atm 进行测试,但这个概念可能会对您有所帮助

页面中的示例 webmethod(重要的是用于 ajax 调用的静态、WebMethod 和 ScriptMethod)

public partial class Products : System.Web.UI.Page 

   { 
    [System.Web.Services.WebMethod()] 
    [System.Web.Script.Services.ScriptMethod()] 
    public static List<Product> GetProducts(int cateogryID) 
    {
      // Put your logic here to get the Product list 
    }
于 2012-12-17T13:35:32.513 回答
0

是的 !!!有用 !!

问题在于获得第二个列表结果的查询,我必须这样做:

var periode = (from i in itemsDate
                       where i.Field<String>("CD_APPLI").Trim() == appli.Trim()
                       select new { value = i.Field<Int64>("PERIODE").ToString(), text = i.Field<Int64>("PERIODE").ToString() });

而不是这样:

            var periode = (from i in itemsDate
                       where i.Field<String>("CD_APPLI").Trim() == appli.Trim()
                       select new SelectListItem { Value = i.Field<Int64>("PERIODE").ToString(), Text = i.Field<Int64>("PERIODE").ToString() });

我的其余代码相对于第二个答案没有变化。

现在我将尝试第三个列表,如果我有其他问题,我会回到这里。

真的感谢你的帮助,ufosnowcat :D

于 2012-12-18T13:36:28.910 回答
0

作为对最后一条评论的回答

添加一个请选择将是一种方法;在您的 3d 列表数据的返回函数中,在位置 0 上插入一个值“请选择”,强制用户触发操作

另一种选择是:1)将您现在在 .change 函数中调用的逻辑放在一个单独的函数中,这样更容易从多个地方调用

然后在填充当前(3d)列表后绑定更改函数的位置检查列表中是否只有一项,如果调用该函数来填充第 4 个列表,您可以将其集成到每个列表的填充中:在

$.each(months, function (index, periode) {... }));

放一些类似的东西(检查你可以用句号做什么)

if (periode.count() == 1) {fillnextList();};
于 2012-12-19T12:51:33.510 回答