【问题标题】:DropDownList not firing its SelectedIndexChanged when loaded with no datasource没有数据源加载时,DropDownList 不会触发其 SelectedIndexChanged
【发布时间】:2012-01-04 18:00:46
【问题描述】:

今天我发现了一个奇怪的问题,我试图触发 DropDownList SelectedIndexChanged 事件,但它根本不起作用。在检查了其他 DropDownLists 后,我注意到唯一的区别是它们是使用数据源填充的,而这个是在后端手动填充的。

这是我所拥有的:

<asp:DropDownList ID="DDDynAccount" runat="server" 
onselectedindexchanged="DDDynAccount_SelectedIndexChanged" 
AutoPostBack="true"></asp:DropDownList>

然后是加载时的Backcode:

DDDynAccount.Items.Add(new ListItem("ANY", "%"));
DDDynAccount.Items.Add(new ListItem("SELECT", "%"));

没有被触发的事件:

public void DDDynAccount_SelectedIndexChanged(object sender, EventArgs e) {
    string s = ""; // I have a breackpoint here
}

如果我这样做,则永远不会触发该事件。 我试过设置和关闭 AutoPostBack。没有。 我尝试从头开始制作新控件。没有。 一旦我手动添加了它的项目但不使用数据源,我也尝试调用 Databind()。还是什么都没有。

我在同一页面中有另一个 DropDownList 有效。唯一的区别是那个使用的是数据源。所以我尝试了这个:

    List<ListItem> ds = new List<ListItem>();
    ds.Add(new ListItem("ANY", "%"));
    ds.Add(new ListItem("SELECT", "%"));
    DDDynAccount.DataSource = ds;
    DDDynAccount.DataBind();

这会奏效的。

我的问题很简单。 为什么? 如果我不使用数据源,为什么我不能触发事件?还是有什么其他问题?


我在 Web 应用程序中使用 .Net4 和 C#。


更新:好的对不起,但是,在检查了这里编写的代码后,我意识到了一些细节,我手动添加的项目具有相同的值,更改它问题就解决了。我认为事件没有被触发,因为值没有改变,尽管“SelectedIndexChanged”不应该在值改变时触发,而是在索引改变时触发。

【问题讨论】:

    标签: c# asp.net .net


    【解决方案1】:

    两个项目的值相同,所以当你选择第二个项目时,默认选择第一个项目,下拉列表的值是改变,所以只要代码是担心什么都没有改变,也没有什么可做的。

    改用这样的代码:

    DDDynAccount.Items.Add(new ListItem("ANY", "%%"));
    DDDynAccount.Items.Add(new ListItem("SELECT", "%"));
    

    会触发事件就好了。

    这实际上是 .NET 的错误 - 它仅适用于 value 假设它是唯一的,而不适用于项目索引。

    作为旁注,为避免每次回帖添加越来越多的项目,请使用以下语句包装添加:

    if (!Page.IsPostBack)
    {
        DDDynAccount.Items.Add(new ListItem("ANY", "%%"));
        DDDynAccount.Items.Add(new ListItem("SELECT", "%"));
    }
    

    编辑:很好奇你说它可以很好地绑定数据源,所以我自己试了一下。好吧,它也因数据源而失败。使用您发布的代码:

    List<ListItem> ds = new List<ListItem>();
    ds.Add(new ListItem("ANY", "%"));
    ds.Add(new ListItem("SELECT", "%"));
    DDDynAccount.DataSource = ds;
    DDDynAccount.DataBind();
    

    快速查看 HTML 源代码显示每个选项的 实际上是其文本 - ANYSELECT,而不是您尝试分配的值。要分配正确的值,您需要这样的代码:

    List<ListItem> ds = new List<ListItem>();
    ds.Add(new ListItem("ANY", "%"));
    ds.Add(new ListItem("SELECT", "%"));
    DDDynAccount.DataTextField = "Text";
    DDDynAccount.DataValueField = "Value";
    DDDynAccount.DataSource = ds;
    DDDynAccount.DataBind();
    

    您将遇到与一一分配项目相同的问题,因为现在值将相同。

    【讨论】:

    • 谢谢伙计,是的,我意识到,就在我发送问题时,我以前没有这样做,太糟糕了。无论如何,很高兴知道这是一个 .Net 错误,而不是我必须阅读更多书籍才能获得它:))) 是的,我避免了一个 !Page.IsPostBack 条件调用该函数来对代码求和。
    • 无论如何,如果不是手动添加项目,而是使用数据源进行操作,它们可以具有相同的值并且可以正常工作。因此,如果您使用数据源,则不会发生这种情况,除非您不使用。
    • 嗯,您使用的是哪个 .Net 版本?因为我保证它对我有用,所以我再次测试它并且它有效。我的是 Web 应用程序上的 C#.Net 4.0。不过,您对价值观是正确的。我给你看下面的 HTML。
    • 糟糕,抱歉,我没有正确阅读您的内容,是的,您是对的。我现在明白了;)
    【解决方案2】:

    我按照你所说的进行测试,如果索引更改但值未更改,则事件不会触发

    【讨论】:

      【解决方案3】:

      如果我使用这个:

      List<ListItem> ds = new List<ListItem>();
      ds.Add(new ListItem("ANY", "%"));
      ds.Add(new ListItem("SELECT", "%"));
      DDDynAccount.DataSource = ds;
      DDDynAccount.DataBind();
      

      此 HTML 已打印:

      <select id="MainContent_DDDynAccount" onchange="javascript:setTimeout('__doPostBack(\'ctl00$MainContent$DDDynAccount\',\'\')', 0)" name="ctl00$MainContent$DDDynAccount">
          <option value="ANY" selected="selected">ANY</option>
          <option value="SELECT">SELECT</option>
      </select>
      

      事件被触发了,真的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-28
        • 2011-06-21
        相关资源
        最近更新 更多