Martin Lauritsen Ответов: 2

Проблемы с каскадным выпадающим списком и повторяющимися элементами


Привет, у меня есть проблема, что мои динамические выпадающие списки делают дубликаты элементов.
Я выбрал событие изменения, где я заполняю выпадающий список № 2 на основе того, что выбрано в выпадающем списке № 1. Но каждый раз, когда я заполняю его, он делает двойное содержание. И я думаю, что перепробовал все.

Код C#


SelectedIndexChanged

protected void ddl_SelectedIndexChanged(object sender, EventArgs e)
   {
       //PlaceHolder1.Controls.Clear();

       XmlDocument doc = new XmlDocument();

       doc.Load(Server.MapPath("./xmlReBikeInfo/InfoBikeResponse.xml"));


       Table table = (Table)PlaceHolder1.FindControl("Table1");

       if (table != null)
       {


           for (int i = 0; i < Rows; i++)
           {

               DropDownList ddl = (DropDownList)PlaceHolder1.FindControl("ddlBike_" + i + "");

               //Use Request objects for getting the previous data of the dynamic textbox

               string biketype = ddl.SelectedValue;

               HiddenField hdnSize = (HiddenField)PlaceHolder1.FindControl("hdnSize_" + i + "");


               DropDownList ddlSize = (DropDownList)PlaceHolder1.FindControl("ddlSize_" + i + "");
               ddlSize.CssClass = "dropdown";
               //ddlSize.SelectedValue = "";
               ddlSize.Visible = true;


               TextBox txt = (TextBox)PlaceHolder1.FindControl("txtPrice_" + i + "");

               HiddenField hdnCykelPris = (HiddenField)PlaceHolder1.FindControl("txtHdnCykelPris_" + i);


               HiddenField hdnAccPris = (HiddenField)PlaceHolder1.FindControl("txtHdnAccPris_" + i);

               string number1;

               string number2;


               XDocument xdoc = XDocument.Load(Server.MapPath("./xmlReBikeInfo/InfoBikeResponse.xml"));
               var bikeSizes = xdoc.Descendants("BikeType")
                   .Where(x => x.Element("TypeName").Value == biketype)
                   .SelectMany(x => x.Descendants("SizeName").Select(y => y.Value))
                   .ToList();

               var bikePrice = xdoc.Descendants("BikeType")
                   .Where(x => x.Element("TypeName").Value == biketype)
                   .SelectMany(x => x.Descendants("TypePriceVat").Select(y => y.Value))
                   .ToList();

               var bikeAcc = xdoc.Descendants("Accessorie")
                   .Where(x => x.Element("AccessorieName").Value == biketype)
                   .SelectMany(x => x.Descendants("AccessoriePriceVat").Select(y => y.Value))
                   .ToList();
               decimal result = 0;
               if (biketype == "0")
               {

                   txt.Text = "";


               }
               if (biketype == "Touring")
               {


                   foreach (string s in bikeSizes)
                   {

                       ddlSize.Items.Add(new ListItem(s + ""));

                   }

                   foreach (string p in bikePrice)
                   {


                       hdnCykelPris.Value = p.ToString();
                       string accPrice = "";

                       if (hdnAccPris.Value == "")
                       {
                           accPrice = "0";
                       }
                       else
                       {
                           accPrice = hdnAccPris.Value;
                       }

                       number1 = hdnCykelPris.Value;
                       number2 = accPrice.ToString();

                       result = decimal.Parse(number1) + decimal.Parse(number2);


                       txt.Text = result.ToString();


                       //txt.Text = hdnCykelPris.Value;
                       //litSum.Text = txt.Text;


                   }

                   ddlSize.Visible = true;


               }
               if (biketype == "Junior Bike")
               {


                   foreach (string s in bikeSizes)
                   {

                       ddlSize.Items.Add(new ListItem(s + ""));

                   }


                   foreach (string p in bikePrice)
                   {

                       hdnCykelPris.Value = p.ToString();




                       string accPrice = "";

                       if (hdnAccPris.Value == "")
                       {
                           accPrice = "0";
                       }
                       else
                       {
                           accPrice = hdnAccPris.Value;
                       }

                       number1 = hdnCykelPris.Value;
                       number2 = accPrice.ToString();

                       result = decimal.Parse(number1) + decimal.Parse(number2);


                       txt.Text = result.ToString();

                       //txt.Text = hdnCykelPris.Value;
                   }

               }
               if (biketype == "MTB")
               {



                   foreach (string s in bikeSizes)
                   {


                       ddlSize.Items.Add(new ListItem(s + ""));


                   }

                   foreach (string p in bikePrice)
                   {

                       hdnCykelPris.Value = p.ToString();


                       string accPrice = "";

                       if (hdnAccPris.Value == "")
                       {
                           accPrice = "0";
                       }
                       else
                       {
                           accPrice = hdnAccPris.Value;
                       }

                       number1 = hdnCykelPris.Value;
                       number2 = accPrice.ToString();

                       result = decimal.Parse(number1) + decimal.Parse(number2);


                       txt.Text = result.ToString();

                       //txt.Text = hdnCykelPris.Value;
                   }


               }
               if (biketype == "Classic E")
               {





                   foreach (string s in bikeSizes)
                   {
                       ddlSize.Items.Clear();
                       ddlSize.Items.Add(new ListItem(s + ""));

                       //ddlSize.ClearSelection();
                   }
                   ddlSize.Visible = true;

                   foreach (string p in bikePrice)

                       hdnCykelPris.Value = p.ToString();


                   string accPrice = "";

                   if (hdnAccPris.Value == "")
                   {
                       accPrice = "0";
                   }
                   else
                   {
                       accPrice = hdnAccPris.Value;
                   }

                   number1 = hdnCykelPris.Value;
                   number2 = accPrice.ToString();

                   result = decimal.Parse(number1) + decimal.Parse(number2);


                   txt.Text = result.ToString();


               }


           }


Что я уже пробовал:

Не способ, метод очистки деталей перед заполнением.

И этот метод
public static void RemoveDuplicateItems(DropDownList ddl)
{

for (int i = 0; i < ddl.Items.Count; i++)
{
ddl.SelectedIndex = i;
string str = ddl.SelectedItem.ToString();
for (int counter = i + 1; counter < ddl.Items.Count; counter++)
{
ddl.SelectedIndex = counter;
string compareStr = ddl.SelectedItem.ToString();
if (str == compareStr)
{
ddl.Items.RemoveAt(counter);
counter = counter - 1;
}
}
}
}

2 Ответов

Рейтинг:
2

#realJSOP

Вы должны удалить дубликаты перед привязкой коллекции к выпадающему списку.

В общем, честно говоря, если вы не хотите, чтобы дубликаты были в вашей коллекции, возможно, вам следует изучить механизм, который добавляет их в базу данных, и предотвратить их дублирование (если это возможно).


Martin Lauritsen

я пробую это сделать с помощью вышеприведенного метода. я вызываю метод как первое, что происходит в событии SelectedIndexChanged. но это не сработало, он продолжает дублировать предметы

Рейтинг:
1

Maciej Los

Я не уверен, что хорошо вас понимаю... Но, если вы хотите получить уникальные данные, вы можете использовать Метод Distinct() [^]:

var bikeSizes = xdoc.Descendants("BikeType")
    .Where(x => x.Element("TypeName").Value == biketype)
    .SelectMany(x => x.Descendants("SizeName").Select(y => y.Value))
    .Distinct() //here!
    .ToList();


Martin Lauritsen

У меня есть выпадающий список, который каждый раз, когда я вызываю событие SelectedIndexChanged, он дублирует элементы, поэтому, если у меня есть 123, то я вызываю SelectedIndexChanged, и он становится 123123, он продолжает добавлять значения ко всем выпадающим спискам.

Martin Lauritsen

внятно не получилось

Maciej Los

Это работает, как и ожидалось. Ваш код работает не так, как вы хотите. Отладьте его, чтобы выяснить, где вы допустили ошибку(ы).