найти, если значение раскрывающегося списка было добавлено динамически - PullRequest
0 голосов
/ 07 декабря 2009

Есть ли способ определить (после обратной передачи), было ли значение в раскрывающемся списке динамически добавлено или является одним из начальных значений?

например.

<asp:DropDownList ID="MyDDL" runat="server">
  <asp:ListItem>1</asp:ListItem>
  <asp:ListItem>2</asp:ListItem>
  <asp:ListItem>3</asp:ListItem>
</asp:DropDownList>

// on postback 1
private void AddExtraItemToList()
{
    if (someCondition) // extra items may or may not be inserted
        MyDDL.Items.Add("17");
}


// on postback 2
private void RemoveExtraItemsFromList()
{
    // remove any non-default values from the list... ?
}

Это довольно просто сделать, закодировав список значений по умолчанию в коде или что-то в этом роде, но было бы неплохо, если бы вы могли сделать это, выполнив запрос о том, какие значения были первоначальными свойствами, а какие были созданы при восстановлении состояния представления.

Ответы [ 3 ]

1 голос
/ 07 декабря 2009

Вы можете присвоить элементам списка одинаковые значения в зависимости от того, были ли они оригинальными или дополнительными.

<asp:DropDownList ID="MyDDL" runat="server">
    <asp:ListItem Value="A">1</asp:ListItem>
    <asp:ListItem Value="A">2</asp:ListItem>
    <asp:ListItem Value="A">3</asp:ListItem>
</asp:DropDownList>

private void AddExtraItemToList() {
    if (someCondition) // extra items may or may not be inserted
        MyDDL.Items.Add(new ListItem("17", "B");
}

private void RemoveExtraItemsFromList() {
    for (int x = MyDDL.Items.Count - 1; x > 0; --x) {
        if MyDDL.Items[x].Value = "B" {
            MyDDL.Items.RemoveAt(x);
        }
    }
}

Извините, если есть ошибки синтаксиса C # - я немного заржавел и перевожу с VB.

1 голос
/ 08 декабря 2009

Лучший способ справиться с этим - отслеживать исходные значения в вашем коде с самого начала.

Вот адаптированная версия вашего кода, которая делает это, сохраняя оригиналы в viewstate (вы можете хранить их где угодно). Хитрость заключается в том, что вы должны вытащить элементы из выпадающего меню, ПРЕЖДЕ ЧЕМ вы делаете какие-либо динамические вставки для новых элементов.

        public string[] OriginalDropDownValues
        {
            get
            {
                return ViewState["origValues"] as string[];
            }
            set
            {
                ViewState.Add("origValues", value);
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                // get the values from the control and store them in viewstate
                var oValues = new List<string>();
                foreach (ListItem item in MyDDL.Items)
                {
                    oValues.Add(item.Value);
                }
                OriginalDropDownValues = oValues.ToArray();
            }
        }

        // on postback 2
        private void RemoveExtraItemsFromList()
        {
            List<string> valuesToKill = new List<string>();
            var oItems = OriginalDropDownValues;
            foreach (ListItem currentItem in MyDDL.Items)
            {
                if (!oItems.Contains(currentItem.Value))
                {
                    // can't remove items yet, would modify collection we are iterating through
                    valuesToKill.Add(currentItem.Value);

                }
            }
            foreach (var killVal in valuesToKill)//loop kill values and locate+remove each from drop down.
            {
                MyDDL.Items.Remove(MyDDL.Items.FindByValue(killVal));
            }
        }
0 голосов
/ 07 декабря 2009
...