对于我的应用程序,我需要合并一些下拉列表,以便在这些列表中选择的不同值的函数中显示一些表。 但是当我在一个列表中选择一个值时,另一个填充了该值的函数,我不知道该怎么做。
在我的应用程序中,我只使用这样的Raw查询:
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)的例子,因为它根本不起作用,我做了什么,我的代码简直就是废话......
答案 0 :(得分: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%正确,因为我不能自己测试它,但这个概念可能对你有帮助
页面中的webmethod示例(重要的是静态的,WebMethod和用于ajax调用的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
}
答案 1 :(得分: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
答案 2 :(得分:0)
作为对上一条评论的回答
添加请选择将是1种方式; 在你的返回函数中为你的3d列表数据插入位置0的值'请选择'强制用户触发动作
另一种选择是: 1)将你现在在.change函数中调用的逻辑放在一个单独的函数中,这样可以更容易地从几个地方调用
然后在填充当前(3d)列表后绑定更改函数的位置,检查列表中是否只有1个项目 如果是这样调用函数来填充第4个列表,你可以将它集成到每个列表的填充中:
之后$.each(months, function (index, periode) {... }));
把类似的东西(检查你可以用句号做什么)
if (periode.count() == 1) {fillnextList();};