我有一个包含以下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");
}
}
答案 0 :(得分:0)
它们的数据应按顺序填充下拉列表,如果选择了区域,则填充 REGION => AREA => TERRITORY => TOWN ,因为您已经想这样做。
GetFilteredGeographicalHierarchy
方法根据父项选择(TOWN
除外)在其他子项中填充数据。让我们先选择“区域”,然后选择“填充所选区域下的区域”,然后选择一个区域,然后填充该区域。如果您采用这种方法,那么您将能够获得所需的结果。
每次选择下拉菜单以获取过滤器数据时,都必须调用GetFilteredGeographicalHierarchy
方法。
注意:如果您选择区域后代,则再也不会重新填充区域列表。
我正在调用所有下拉列表的索引更改事件
您应该跳过调用方法BindZones(dt_Filtered);当SelectedIndexChanged事件调用其他子下拉菜单时