使用Linq

时间:2018-09-27 05:51:35

标签: c# asp.net linq

我有一个包含以下5列的表格:

区域,地区,区域,领土,城镇

地区取决于区域,地区取决于区域,领土取决于区域,城镇取决于区域。

我的那5列中都有5个下拉菜单。

用户可以选择区域,然后所有剩余的4个下拉列表将被绑定,具体取决于所选区域,所有下拉列表的依此类推。

我已经在C#DataTable中选择了一次完整的数据,然后尝试使用LINQ查询来获得所需的结果。

在所有下拉列表的选定索引更改事件中,我正在从方法中获取过滤后的数据表,然后提供数据源。

这是我的代码:

public DataTable GetFilteredGeographicalHierarchy()
{
    dt_DistributionHierarchy = Session["DistributionHierarchy"] as DataTable;
    DataTable dt_Filtered = new DataTable();

    if (DDL_Zones.Items.Count > 0 && DDL_Regions.Items.Count > 0 && DDL_Area.Items.Count > 0 && DDL_Territory.Items.Count > 0 && DDL_Town.Items.Count > 0)//if the dropdowns are already filled before
    {
        IEnumerable<DataRow> query =
                    from records in dt_DistributionHierarchy.AsEnumerable()
                    where
                    records.Field<string>("ZONE") == (DDL_Zones.SelectedIndex != 0 ? DDL_Zones.SelectedValue.ToString() : records.Field<string>("ZONE"))
                    &&
                    records.Field<string>("REGION") == (DDL_Regions.SelectedIndex != 0 ? DDL_Regions.SelectedValue.ToString() : records.Field<string>("REGION"))
                    &&
                    records.Field<string>("AREA") == (DDL_Area.SelectedIndex != 0 ? DDL_Area.SelectedValue.ToString() : records.Field<string>("AREA"))
                    &&
                    records.Field<string>("TERRITORY") == (DDL_Territory.SelectedIndex != 0 ? DDL_Territory.SelectedValue.ToString() : records.Field<string>("TERRITORY"))
                    &&
                    records.Field<string>("TOWN") == (DDL_Town.SelectedIndex != 0 ? DDL_Town.SelectedValue.ToString() : records.Field<string>("TOWN"))

                    select records;                 


        try { dt_Filtered = query.CopyToDataTable<DataRow>(); }
        catch (Exception ex)
        {
            //dt_Filtered = null;
        }
    }
    else
    {
        dt_Filtered = dt_DistributionHierarchy;
    }
    return dt_Filtered;
}

问题是,当我选择Region时,其他4个下拉列表都已正确绑定,但是在重新绑定后,该区域Dropdown仅剩下一项被选中了。

此外,我不能为所有下拉菜单编写单独的方法。我必须从这种单一的过滤方法中获得结果。

请帮助我解决这些层叠问题。

区域绑定应取决于所选区域。当我选择任何区域时,它应返回该区域下的所有区域,并应返回所选区域的所有区域,但仅返回一个已选择的区域。

更新

以下是我在所有下拉列表的索引更改事件上调用的方法:

 public void BindGeographicalHierarchySection()
        {

            DataTable dt_Filtered = new DataTable();
            dt_Filtered = GetFilteredGeographicalHierarchy();
            //Before Binding again, retain the previously selected values to  not to lose the selection
            string zone = DDL_Zones.SelectedValue;
            string region = DDL_Regions.SelectedValue;
            string area = DDL_Area.SelectedValue;
            string Territory = DDL_Territory.SelectedValue;
            string town = DDL_Town.SelectedValue;

            if (dt_Filtered!=null)
            {
                if (dt_Filtered.Rows.Count==0)
                {
                    dt_Filtered = null;
                }
            }
            BindZones(dt_Filtered);
            BindRegion(dt_Filtered);
            BindArea(dt_Filtered);
            BindTerritory(dt_Filtered);
            BindTown(dt_Filtered);

            //After Binding Try to make the selection with the previously selected values if they now exists
            //try
            //{
            //    DDL_Zones.Items.FindByValue(zone).Selected = true;
            //}
            //catch (Exception)
            //{

            //}
            try
            {
                DDL_Regions.ClearSelection();
                DDL_Regions.Items.FindByValue(region).Selected = true;
            }
            catch (Exception)
            {

            }
            try
            {
                DDL_Area.ClearSelection();
                DDL_Area.Items.FindByValue(area).Selected = true;
            }
            catch (Exception)
            {

            }
            try
            {
                DDL_Territory.ClearSelection();
                DDL_Territory.Items.FindByValue(Territory).Selected = true;
            }
            catch (Exception)
            {

            }
            try
            {
                DDL_Town.ClearSelection();
                DDL_Town.Items.FindByValue(town).Selected = true;
            }
            catch (Exception)
            {

            }


        }

以下是绑定的方法:

public void BindZones(DataTable dt_DistributionHierarchy)
        {
            if (dt_DistributionHierarchy != null)
            {
                string[] columns = { "zone" };
                DataTable dt = new DataTable();
                dt = dt_DistributionHierarchy.DefaultView.ToTable(true, columns);
                if (dt.Rows.Count == 1)
                {
                    DDL_Zones.ClearSelection();
                    DDL_Zones.Items.FindByValue(dt.Rows[0]["zone"].ToString()).Selected = true;
                }
                else//if more than 1 then rebind
                {

                    DDL_Zones.DataSource = dt;
                    DDL_Zones.DataValueField = "zone";
                    DDL_Zones.DataTextField = "zone";
                    DDL_Zones.DataBind();
                    DDL_Zones.Items.Insert(0, "All");
                }

            }
            else
            {
                DDL_Zones.DataSource = null;              
                DDL_Zones.DataBind();
                DDL_Zones.Items.Insert(0, "All");

            }




        }
        public void BindRegion(DataTable dt_DistributionHierarchy)
        {
            if (dt_DistributionHierarchy != null)
            {

                string[] columns = { "Region" };
                DataTable dt = new DataTable();
                dt = dt_DistributionHierarchy.DefaultView.ToTable(true, columns);

                    DDL_Regions.DataSource = dt;
                    DDL_Regions.DataValueField = "Region";
                    DDL_Regions.DataTextField = "Region";
                    DDL_Regions.DataBind();
                    DDL_Regions.Items.Insert(0, "All");


            }
            else
            {
                DDL_Regions.DataSource = null;                
                DDL_Regions.DataBind();
                DDL_Regions.Items.Insert(0, "All");
            }
        }

1 个答案:

答案 0 :(得分:0)

它们的数据应按顺序填充下拉列表,如果选择了区域,则填充 REGION => AREA => TERRITORY => TOWN ,因为您已经想这样做。

  1. 对于“区域”下拉列表-列出所有区域(您只需填写一次此下拉列表)
  2. 对于子项下拉列表,请使用GetFilteredGeographicalHierarchy方法根据父项选择(TOWN除外)在其他子项中填充数据。

让我们先选择“区域”,然后选择“填充所选区域下的区域”,然后选择一个区域,然后填充该区域。如果您采用这种方法,那么您将能够获得所需的结果。

每次选择下拉菜单以获取过滤器数据时,都必须调用GetFilteredGeographicalHierarchy方法。

注意:如果您选择区域后代,则再也不会重新填充区域列表。

  

我正在调用所有下拉列表的索引更改事件

您应该跳过调用方法BindZones(dt_Filtered);当SelectedIndexChanged事件调用其他子下拉菜单时