2012-12-17 35 views
0

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

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

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

我完全失去了与这些级联dropdownlists,我真的需要你的帮助:/ 如果您需要的代码,我可以给你这但即使我已经尝试了一些这些列表的解决方案,我不能给你我的代码(JavaScript)的例子,因为它不工作,我什么都做,我的代码只是很多废话。 ..

回答

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(重要的是静态的,和的WebMethod为ScriptMethod Ajax调用)

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 
    } 
+0

VOUS pourriez peut-理由essayer德formuler VOTRE问题autrement。 – ufosnowcat

+0

Ok ok mais en Anglais:D所以,我有2个下拉列表:一个是应用程序列表,另一个是日期列表。我想要的是使用jQuery和原始查询在第一个列表(应用程序列表)中的选定值的函数中填充第二个列表(日期列表)。要做到这一点,我认为要走的路是在第一个列表中选择一个值,一个操作获取选定的值并填充第二个列表中的相应数据。清楚吗 ? – Genyuumaru

+0

更好:)我会尽力更新一下 – ufosnowcat

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

+0

欢迎你,所以你不得不使用一个对象与selectlistitem pff不知道:p stackoverflow调试;) – ufosnowcat

+0

我忘了问一件事,你知道我怎么能得到两个选择的值下拉列表为了在JavaScript中填充第三个列表?我可以做一个这样的事情︰'$('#List1','#List2')。change(function()?我不这么认为,但我是一个真正的JavaScript初学者,所以为什么不:D – Genyuumaru

+0

你可以使用jquery选择器一次绑定到多个元素的更改函数(请看这里http://api.jquery.com/category/selectors/)easyest是一个类选择器$('。ListesDiaboliques')。更改(...然后将cssclass ListesDiaboliques应用于所有需要绑定的下拉列表,但是您希望这样做吗?被调用的函数对于所有这些下拉列表都是相同的,通常会导致更复杂的函数来采用所有可能的方式考虑到以及更多的错误 – ufosnowcat

0

为回答最后一个注释

加入请将要走1路; 为您的3D列表中插入对位置值0“请选择”强制用户触发动作

数据你的回报功能的另一个选项是: 1)把你现在在调用逻辑。更改功能在一个单独的功能,这样就更容易从几个地方打电话

然后在您填写当前(3d)列表后,您绑定更改功能的位置检查列表中是否只有一个项目 调用函数填充第四个列表,您可以将其整合到每个列表的填充中: 之后

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

装上去一样(检查你可以用周期做什么)

if (periode.count() == 1) {fillnextList();}; 
+0

添加这个不会改变任何东西:/我找到了一个解决方案来纠正这个问题,我只是增加了一个像这样的值:“ --- Appli ---“然后我可以选择列表中唯一的真实值。 – Genyuumaru