【问题标题】:Adding Item to DataBound Drop Down List将项目添加到 DataBound 下拉列表
【发布时间】:2010-11-09 11:04:28
【问题描述】:

是的,我已经阅读了这里的大部分主题,但找不到有效的答案。

我有三个下拉列表。第一个是数据绑定以获取不同的实验名称。用户选择,返回页面,第二个下拉菜单显示不同的时间点。这是我需要帮助的地方。我需要在那个下拉列表中添加一个 ID、DataTextField、DataValueField 都是 TimePt 的项目。

看起来很简单,但我无法让它工作。

protected void Page_Load(object sender, EventArgs e)
        {
            if (Page.IsPostBack)
            {
                TimePt.DataSource = TimePTDD;
                TimePt.DataValueField = "TimePt";
                TimePt.DataTextField = "TimePt";
                TimePt.DataBind();
                TimePt.Items.Insert(0, new ListItem("--Select---", "0"));
                TimePt.SelectedIndex = 0;
            }
        }

我错过了一些东西。

【问题讨论】:

  • 这应该可以。您是否遇到任何编译错误?
  • 我什么也没得到。我的页面加载和第二个下拉列表只是说 12 72 192 它应该说 --Select-- ... 12...72...192。如果我使用 AppendDataBoundItems,它会做我想要的,但是当我更改第一个下拉列表时,其他时间点会添加到 TimePt 下拉列表中。

标签: c# asp.net data-binding list drop-down-menu


【解决方案1】:

我建议使用DropDownList 控件的OnDataBound 事件,并将您的代码放在后面。 这样你就可以将DataSourceID 与后面的代码结合起来。

【讨论】:

    【解决方案2】:
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Page.IsPostBack)
            {
                TimePt.DataValueField = "TimePt";
                TimePt.DataTextField = "TimePt";
                var times = TimePTDD.ToList();
                times.Insert(0, new {TimePt="0",TimePt="--Select--"});
                TimePt.DataSource = times;
                TimePt.DataBind();
                //TimePt.SelectedIndex = 0;
            }
        }
    

    【讨论】:

      【解决方案3】:

      我敢打赌,这是一个页面生命周期问题。根据 MSDN,each data bound control whose DataSourceID property is set calls its DataBind method

      我认为这些值被绑定到下拉列表两次。首先,当您手动绑定并附加 Page_Load 中的额外项目时,然后数据源被绑定到 Page_PreRender 事件中。尝试将您的 Page_Load 代码放入 Page_PreRender。希望订单有所帮助。

      【讨论】:

        【解决方案4】:

        我看到您以两种不同的方式指定 DataSource - 您的标记中的 DataSourceID 以及在您的代码隐藏中手动设置 DataSource。尝试从您的标记中删除 DataSourceID 看看是否有帮助。

        我已经有一段时间没有过多地使用 ASP.NET,但我感觉您的 DropDownListPage_Load 之后重新绑定,这将取代您之前的绑定。

        【讨论】:

        • 是的,当我更改第一个下拉列表时,这就是我需要它做的事情,但是我需要 TimePt 下拉列表中的“-select-”,而不会因为重新绑定而出现重复值列表,因为第一个下拉菜单中的数据发生了变化。
        • 这不应生成重复值,因为AppendDataBoundItems 未设置为 true。
        • 不,不应该,因为我把它关掉了,但是如果我把它打开,那么它会导致重复值,但是如果我使用 ,但我希望这个项目总是出现,不管我从第一个下拉菜单中选择什么,然后后续项目是基于什么是动态的选择:)。
        • 这里的问题是,有些实验有三个时间点,而有些实验只有一两个。
        【解决方案5】:

        在您的下拉列表中设置AppendDataBoundItems="true",它应该可以工作。

        这是一个类似的问题:How to add Item to SqlDataSource databound list

        另一个关于使用此方法的潜在重复及其解决方法:Dropdownlist AppendDataboundItems (first item to be blank)

        【讨论】:

        • 它不会做我想做的事。我试过了,它可以工作,但是每当我返回并选择第一个下拉列表时,我会在第二个下拉列表中得到重复的值(这是我希望“SELECT”所在的位置。该链接也无济于事我是因为我尝试了它,它说我没有一个名为“MyList”的方法,这是我命名的。
        • 您是否打算在页面加载中使用 if (Page.IsPostBack) 而不是 if (!Page.IsPostBack)?
        • 我打算使用 IsPostBack,因为当您选择第一个下拉列表时,页面会加载,第二个下拉列表会根据从第一个下拉列表中选择的内容进行填充。
        【解决方案6】:
        <asp:DropDownList ID="ExpAnalysisName" runat="server"
                    DataSourceID="DropDownEXP" DataTextField="ExpAnalysisName" 
                    DataValueField="ExpAnalysisName" AppendDataBoundItems="true" AutoPostBack=true>
                    <asp:ListItem Selected="True" Value="0">Select an Experiment</asp:ListItem>
                </asp:DropDownList>
                <asp:SqlDataSource ID="DropDownEXP" runat="server" 
                    ConnectionString="<%$ ConnectionStrings:SGMD3_DataBase %>" SelectCommand="SELECT DISTINCT ExpAnalysisName FROM VW_Data">
                </asp:SqlDataSource>
        
        <asp:DropDownList ID="TimePt" runat="server" AutoPostBack="True" DataSourceID="TimePTDD" DataTextField="TimePt" 
                        DataValueField="TimePt">
                </asp:DropDownList>
                    <asp:SqlDataSource ID="TimePTDD" runat="server" 
                        ConnectionString="<%$ ConnectionStrings:SGMD3_DataBase %>" SelectCommand="SELECT DISTINCT TimePt
            FROM VW_Data
            WHERE ExpAnalysisName = @ExpAnalysisName">
                        <SelectParameters>
                            <asp:FormParameter FormField="ExpAnalysisName" Name="ExpAnalysisName" />
                        </SelectParameters>
                    </asp:SqlDataSource>
        
        So you can have a reference.
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-06-24
          • 2010-10-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-15
          • 1970-01-01
          相关资源
          最近更新 更多