DropDownList烦恼:相同的值不会触发事件

时间:2008-11-25 21:25:01

标签: asp.net

我已经使用不同的文本属性填充了一个下拉列表控件,但每个文本属性都有THE SAME值(文本属性为A,值属性为blah,文本属性为B,值属性为blahblah等等)

ASP.net仅在回发时检查值属性,因为所有值都相同(for 测试原因)这个小烦人的行为发生了。有工作吗?这是否意味着你不可能永远不会有相同的价值?

6 个答案:

答案 0 :(得分:8)

听起来你正在处理错误的事件。试试SelectedIndexChanged

确保您还将AutoPostBack属性设置为True

解决

好的,所以我很好奇,因为我很好奇:)

使用非唯一值进行数据绑定时存在“问题”。

所以,首先,我公开道歉说不然。

要复制:

ASPX

    <asp:DropDownList ID="myDDL" runat="server" AutoPostBack="True">
    </asp:DropDownList>
    <asp:Label ID="lblSelItem" runat="server"Text="Currently Selected Item: 0"></asp:Label>
    <asp:Label ID="lblSelVal" runat="server" Text="Currently Selected Value: X"></asp:Label>

代码隐藏

    List<string> MyData()
    {
        List<string> rtn = new List<string>();
        rtn.Add("I am the same value!");
        rtn.Add("I am the same value!");
        rtn.Add("I am the same value!");
        rtn.Add("I am the same value!2");
        return rtn;
    }

    protected void Page_Init()
    {
        if (!Page.IsPostBack)
        {
            // Load the Data for the DDL.
            myDDL.DataSource = MyData();
            myDDL.DataBind();
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        // Display the Currently Selected Item/Value.
        lblSelItem.Text = "Currently Selected Item: " + myDDL.SelectedIndex.ToString();
        lblSelVal.Text = "Currently Selected Value: " + myDDL.SelectedValue;
    }

运行,更改DropDownList中的值。请注意,不会发生PostBack。

在查看Source时,我意识到我们需要为服务器控件生成的value元素显式设置“<option>”属性,这导致我执行以下操作:

新代码背后

    Dictionary<string, string> MyTwoColData()
    {
        Dictionary<string, string> rtn = new Dictionary<string, string>();
        rtn.Add("1", "I am the same value!");
        rtn.Add("2", "I am the same value!");
        rtn.Add("3", "I am the same value!");
        return rtn;
    }

    protected void Page_Init()
    {
        if (!Page.IsPostBack)
        {
            // Load the Data for the DDL.
            Dictionary<string, string> data = MyTwoColData();

            foreach (KeyValuePair<string, string> pair in MyTwoColData())
            {
                myDDL.Items.Add(new ListItem(pair.Value, pair.Key));
            }

            myDDL.DataBind();
        }
    }

这个explcitly将值设置为“1”,“2”,“3”等使它们唯一,同时仍然在列表中显示正确的数据。

显然,您可以将其更改为使用单列列表,但只需运行for循环并使用i或其他值。

关于DataSet的良好解决方法,不确定。

实际上,我们会向用户提供具有完全相同值的选项列表吗?

我个人认为不是,这可能是为什么这个“问题”没有得到解决的原因:)

享受!

PS:

哦,我还应该补充一点,如果您想在“修复”中使用文本值,请将其更改为SelectedItem而不是SelectedValue

答案 1 :(得分:6)

ASP.NET无法区分下拉列表中具有相同值的不同项目,因为当浏览器发送HTTP POST时,它只发送所选值。

ASP.NET将在下拉列表中找到第一项与值匹配的项目。

您需要确保下拉列表中的每个项目都具有不同的值。您可以通过为每个值添加一个键来完成此操作。换句话说,不是每个值都有“blah”,而是使用“blah-1”,“blah-2”等。

答案 2 :(得分:0)

问题是如果所选索引没有改变,则回发不会触发。在用户进行相同选择的情况下,所选索引不会改变。

很抱歉,这不能回答这个问题,但它确实解释了我所知道的行为。

答案 3 :(得分:0)

SelectedIndexChanged甚至不会触发,因为下拉列表控件中的所有listitem值都相同。我做了一些谷歌搜索。看起来这是常见的问题。我还没有找到任何工作。

答案 4 :(得分:0)

你可以使用这样的值:

1:2

2:2

3:2

第二个数字是“真实”值。然后你的事件应该触发,你可以解析代码背后的“真实”值。

为什么你的所有值都相同的下拉?或者只是其中一些是相同的?

答案 5 :(得分:0)

如果您回想起ASP.Net之前的日子,那么使用<SELECT>提交表单的唯一内容就是VALUE的{​​{1}}。然后ASP.Net通过在数据项列表中查找该值来有效地确定选择哪个项目。

您还会注意到,如果您有两个具有相同值但标签不同的项目,如果您在下次加载表单时触发回发,则会显示第一个,即使您在第二个之前选择了第二个进行了回发。


如果您退后一步并考虑原始数据源 - 如果您所拥有的只是值,您将如何识别选择了哪个文本值?您如何从数据库或列表中选择该值?你会如何更新数据库中的那一行?如果您尝试它,您会发现.Net会抛出异常,因为它无法唯一地标识该行。

因此,您需要为数据添加唯一键。