相互依赖的下拉菜单

问题描述:

我有三个下拉菜单使用商店过程来填充我的gridview。我需要第一个设施DropDown在第二个源类型下拉菜单中给出不同的选项,具体取决于选择的设施。有些设施需要查看所有选项,有些只需要1或2个。我不确定如何处理此问题。相互依赖的下拉菜单

以下是下拉菜单和存储过程的代码。

任何帮助,将不胜感激

private void BindGrid() 
{ 
    //set up arguments for the stored proc 
    int? FacilityID = (ddlFacility.SelectedValue.Equals("-1")) ? (int?)null : int.Parse(ddlFacility.SelectedValue); 
    int? SourceTypeID = int.Parse(ddlSource.SelectedValue); 
    int? StatusTypeID = int.Parse(ddlStatusType.SelectedValue); 
    //bind 
    ObjectResult<models.MS_spGetMatchCross_Result> ds = this.DataLayer.model.MS_spGetMatchCross(FacilityID, SourceTypeID, StatusTypeID); 
    gvResults.DataSource = ds; 
    gvResults.DataBind(); 
} 

private void ResetForm() 
{ 
    try 
    { 

     //facility dropdown 
     ddlFacility.Items.Clear(); 
     ddlFacility.DataSource = this.DataLayer.model.MS_spGetFacilityInfo(null).OrderBy(x => x.FacilityName); 
     ddlFacility.DataTextField = "FacilityName"; 
     ddlFacility.DataValueField = "FacilityID"; 
     ddlFacility.DataBind(); 
     ddlFacility.Items.Insert(0, new ListItem("Select a facility...", "-1")); 

     //SourceType dropdown 
     ddlSource.Items.Clear(); 
     ddlSource.DataSource = this.DataLayer.model.SourceTypes; 
     ddlSource.DataTextField = "Description"; 
     ddlSource.DataValueField = "SourcetypeID"; 
     ddlSource.DataBind(); 

     //Match Status dropdown 
     ddlStatusType.Items.Clear(); 
     ddlStatusType.DataSource = this.DataLayer.model.StatusTypes; 
     ddlStatusType.DataTextField = "Description"; 
     ddlStatusType.DataValueField = "StatusTypeID"; 
     ddlStatusType.DataBind(); 

     BindGrid(); 
    } 
    catch (Exception ex) 
    { 
     this.SetMessage(ex.ToString(), PageMessageType.Error); 
     AISLogger.WriteException(ex); 
    } 
} 
+0

您可能要添加标记表明这是什么语言... – eidsonator

一个非常简单的,虽然不完全是优雅的,方法是将处理DropDownList的OnSelectedIndexChanged事件。为了达到这个目的,你必须确保每个DDL的选择都会影响另一个DDL的内容,并将AutoPostBack属性设置为true(这可以确保DDL中的某些内容发生更改时,该页面将导致回发,从而允许您以处理服务器端代码中的更改)。

在你的第一个DropDownList的OnSelectedIndexChanged事件处理程序(在后台代码),你有下面的代码:

// Handle selected item or selected index 
if(ddl1.SelectedItem.Text=="Selection1") 
{ 
    // Get items for DDL2 
    var items=GetDataForDdl2(); 

    // Bind the data 
    DDL2.DataSource=items; 
    DDL2.DataBind(); 
} 

你最好也有类似的逻辑DDL2的SelectedIndexChanged事件处理程序,然后绑定物品DDL3等等。

的东西,作品很好开箱,检查了ASP.NET AJAX AjaxControlToolkit的CascadingDropDown:http://www.asp.net/ajaxLibrary/AjaxControlToolkitSampleSite/CascadingDropDown/CascadingDropDown.aspx

+0

谢谢,我是个有点困惑关于“GetDataForDdl2”部分。应该引用什么。我只是列出dd1被识别后应该进入ddl2的选择吗? – user2425793

+0

这是一个占位符方法,因为我不知道如何检索DropDownList的项目。我们的想法是,在该方法中,您可以从数据库中获取数据,自己创建数据或从其他数据库中检索数据。然后数据将被格式化为列表或甚至DataTable(尽管DataTable是旧的,而不再是这样做的偏爱的方式),以便DDL可以容易地和本地地绑定到它。 –