查找是否动态添加了下拉值

时间:2009-12-07 13:57:54

标签: c# asp.net viewstate

有没有办法确定(在回发后)下拉列表中的值是动态添加的还是初始值之一?

例如

<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... ?
}

通过编写代码隐藏值或其他内容的默认值列表来实现这一点是显而易见的,但如果您可以通过查询哪些值是初始属性以及哪些值是从viewstate恢复生成来完成上述操作,那将是很简单的。

3 个答案:

答案 0 :(得分:1)

您可以根据列表项是原始项还是额外项来为列表项提供相同的值。

<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 :(得分:1)

处理此问题的最佳方法是从一开始就跟踪代码中的原始值。

以下是您的代码的改编版本,通过将原件存储在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));
            }
        }

答案 2 :(得分:0)