Фильтрация списков флажков на основе других списков флажковC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Фильтрация списков флажков на основе других списков флажков

Сообщение Anonymous »

У меня есть 6 списков флажков для выбора бренда, коллекции, продукта, подкатегории, отделки и статуса на складе. Я хотел бы ограничить эти списки флажков на основе выбора в других списках флажков. Например, если кто-то выберет вариант из бренда, то 5 других списков флажков будут обновлены, чтобы отображать только параметры, соответствующие этому бренду. Это не линейно, поэтому пользователи должны иметь возможность начинать с любого списка флажков и должны разрешать множественный выбор в списках флажков.
Вот что у меня есть на данный момент (просто показываю два из них). ведь они все похожи). Проблема, с которой я столкнулся, заключается в том, что любой выбор приводит к тому, что все списки флажков становятся серыми.
protected void CheckBoxListBrand_SelectedIndexChanged(object sender, EventArgs e)
{
LabBrand.Text = "";
FilterCheckBoxLists();
String whereis = " (Table.Vendor = '";
CheckBoxList ckl = (CheckBoxList)sender;
Boolean first = true;
Boolean somechecked = false;
selectionbrand.Text = "";

foreach (ListItem li in ckl.Items)
{
if (li.Selected == true)
{
if (first)
{
whereis += li.Value;
first = false;
}
else
{
whereis += "') OR (Table.Vendor = '" + li.Value;
}
selectionbrand.Text += " " + li.Text;
somechecked = true;
}
}
whereis += "')";
if (somechecked)
{
LabBrand.Text += whereis;
}

Updatepage();
}

protected void CheckBoxListBrand_Set()
{
LabBrand.Text = "";
FilterCheckBoxLists();
String whereis = " (Table.Vendor = '";
CheckBoxList ckl = CheckBoxListBrand;
Boolean first = true;
Boolean somechecked = false;
foreach (ListItem li in ckl.Items)
{
if (li.Selected == true)
{
if (first)
{
whereis += li.Value;
first = false;
}
else
{
whereis += "') OR (Table.Vendor = '" + li.Value;
}
somechecked = true;
}
}
whereis += "')";
if (somechecked)
{
LabBrand.Text += whereis;
}
}

protected void CheckBoxListCollection_SelectedIndexChanged(object sender, EventArgs e)
{
LabCollection.Text = "";
FilterCheckBoxLists();
String whereis = " (Table.Collection = '";
CheckBoxList ckl = (CheckBoxList)sender;
Boolean first = true;
Boolean somechecked = false;
selectioncollection.Text = "";
foreach (ListItem li in ckl.Items)
{
if (li.Selected == true)
{
if (first)
{
whereis += li.Value;
first = false;
}
else
{
whereis += "') OR (Table.Collection = '" + li.Value;
}
selectioncollection.Text += " " + li.Text;
somechecked = true;
}
}
whereis += "')";
if (somechecked)
{
LabCollection.Text += whereis;
}
Updatepage();
}

protected void CheckBoxListCollection_Set()
{
LabCollection.Text = "";
FilterCheckBoxLists();
String whereis = " (Table.Collection = '";
CheckBoxList ckl = CheckBoxListCollection;
Boolean first = true;
Boolean somechecked = false;
foreach (ListItem li in ckl.Items)
{
if (li.Selected == true)
{
if (first)
{
whereis += li.Value;
first = false;
}
else
{
whereis += "') OR (Table.Collection = '" + li.Value;
}
somechecked = true;
}
}
whereis += "')";
if (somechecked)
{
LabCollection.Text += whereis;
}
}

private void FilterCheckBoxLists()
{
var selectedBrands = GetSelectedValues(CheckBoxListBrand);
var selectedCollections = GetSelectedValues(CheckBoxListCollection);

FilterBrands(selectedCollections, selectedProducts, selectedSubCats, selectedFinishes, selectedStocks);
FilterCollections(selectedBrands, selectedProducts, selectedSubCats, selectedFinishes, selectedStocks);
}

private List GetSelectedValues(CheckBoxList checkBoxList)
{
return checkBoxList.Items.Cast()
.Where(li => li.Selected)
.Select(li => li.Value)
.ToList();
}

private void FilterBrands(List selectedCollections, List selectedProducts, List selectedSubCats, List selectedFinishes, List selectedStocks)
{
foreach (ListItem item in CheckBoxListBrand.Items)
{
item.Enabled = true;
}

if (selectedCollections.Any() || selectedProducts.Any() || selectedSubCats.Any() || selectedFinishes.Any() || selectedStocks.Any())
{
foreach (ListItem item in CheckBoxListBrand.Items)
{
item.Enabled = IsBrandRelated(selectedCollections, selectedProducts, selectedSubCats, selectedFinishes, selectedStocks, item.Value);
}
}
}

private void FilterCollections(List selectedBrands, List selectedProducts, List selectedSubCats, List selectedFinishes, List selectedStocks)
{
foreach (ListItem item in CheckBoxListCollection.Items)
{
item.Enabled = true;
}
if (selectedBrands.Any() || selectedProducts.Any() || selectedSubCats.Any() || selectedFinishes.Any() || selectedStocks.Any())
{
foreach (ListItem item in CheckBoxListCollection.Items)
{
item.Enabled = IsBrandRelated(selectedBrands, selectedProducts, selectedSubCats, selectedFinishes, selectedStocks, item.Value);
}
}
}
private bool IsBrandRelated(List selectedCollections, List selectedProducts, List selectedSubCats, List selectedFinishes, List selectedStocks, string brandValue)
{
return
selectedCollections.Any(collection =>
IsCollectionForBrand(collection, brandValue)) ||

selectedProducts.Any(product =>
IsProductForBrand(product, brandValue)) ||

selectedSubCats.Any(subcat =>
IsSubCatForBrand(subcat, brandValue)) ||

selectedFinishes.Any(finish =>
IsFinishForBrand(finish, brandValue)) ||

selectedStocks.Any(stock =>
IsStockForBrand(stock, brandValue));
}

private bool IsCollectionRelated(List selectedBrands, List selectedProducts, List selectedSubCats, List selectedFinishes, List selectedStocks, string collectionValue)
{
return
selectedBrands.Any(brand =>
IsBrandForCollection(brand, collectionValue)) ||

selectedProducts.Any(product =>
IsProductForCollection(product, collectionValue)) ||

selectedSubCats.Any(subcat =>
IsSubCatForCollection(subcat, collectionValue)) ||

selectedFinishes.Any(finish =>
IsFinishForCollection(finish, collectionValue)) ||

selectedStocks.Any(stock =>
IsStockForCollection(stock, collectionValue));
}
//checking CBLs against selected Brand
private bool IsCollectionForBrand(string collection, string brand)
{
return ExecuteQuery($"SELECT COUNT(*) FROM Table WHERE Collection = '{collection}' AND Vendor = '{brand}'") > 0;
}
private bool IsProductForBrand(string product, string brand)
{
return ExecuteQuery($"SELECT COUNT(*) FROM Table WHERE Product = '{product}' AND Vendor = '{brand}'") > 0;
}
private bool IsSubCatForBrand(string subcat, string brand)
{
return ExecuteQuery($"SELECT COUNT(*) FROM Table WHERE SubCategory = '{subcat}' AND Vendor = '{brand}'") > 0;
}
private bool IsFinishForBrand(string finish, string brand)
{
return ExecuteQuery($"SELECT COUNT(*) FROM Table WHERE Finish = '{finish}' AND Vendor = '{brand}'") > 0;
}
private bool IsStockForBrand(string stock, string brand)
{
return ExecuteQuery($"SELECT COUNT(*) FROM Table WHERE Stock = '{stock}' AND Vendor = '{brand}'") > 0;
}

(***SIMILAR CODE TO CHECK CBLs AGAINST SELECTED COLLECTIONS***)

private int ExecuteQuery(string query)
{
int count = 0;

string connectionString = ConfigurationManager.ConnectionStrings["MyConnection"].ConnectionString;

using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlCommand command = new SqlCommand(query, connection))
{
connection.Open();
count = (int)command.ExecuteScalar();
}
}

return count;
}

и .aspx
Brand




Collection






Подробнее здесь: https://stackoverflow.com/questions/790 ... kbox-lists
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»