【问题标题】:Why does my DropDownList not populate with Items from the Page_Load event?为什么我的 DropDownList 没有填充 Page_Load 事件中的项目?
【发布时间】:2017-09-09 10:45:12
【问题描述】:

我有这个控件来获取一些数据:

<asp:DropDownList ID="newsOrEvent" runat="server" Text='<%# Eval("newsEvent") %>'></asp:DropDownList>

然后在我的 Page_Load 我有:

protected void Page_Load(object sender, EventArgs e)
        {

            newsOrEvent.Items.clear();
            newsOrEvent.Items.Add("News");
            newsOrEvent.Items.Add("Event");

                    if (!this.IsPostBack)
                    {
                        if(newsID != 0) 
                        {
                            this.BindRepeater();
                           // this.BindImageRepeater();

                        }   

                    }


        }

我的编译器说:名称 'newsOrEvent' 在当前上下文中不存在

private void BindRepeater()
        {
                using (SqlConnection con = new SqlConnection(constr))
                {
                string myQuery = string.Format("SELECT * FROM tblNewsEvents WHERE newsID = {0}", newsID);


                     using (SqlCommand cmd = new SqlCommand(myQuery, con))
                     {
                        using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
                        {
                            DataTable dt = new DataTable();
                            sda.Fill(dt);
                            news.DataSource = dt;
                            news.DataBind();
                        }
                    }
                }
            }

这篇SO文章here建议:

  • 我应该先.clear这些项目
  • 单独输入&lt;%# Eval("newsEvent") %&gt; 以查看它是否加载到页面中,它会加载。

它还说:

如果下拉控件的Text属性在分配数据源之前被分配了任何值,就会出现这个错误。

如何在读取 Eval 之前先添加项目?

我不明白为什么没有填充 DropDownList

【问题讨论】:

  • 显示页面加载方式。也可能只是清理和重建,甚至重新启动,特别是如果您添加另一个服务器控件并且无法从后面的代码访问该控件。
  • @Crowcoder 已发布 - 如,重新开始?
  • 不要重启你的机器来清除 IIS Express。
  • @Crowcoder 我已经做到了,但没有改变:(
  • 如果您添加其他控件,您可以从后面的代码中引用它们吗?

标签: c# asp.net webforms


【解决方案1】:

正如我在 cmets 中提到的,asp:DropDownList 控件没有 Text 属性。填充下拉列表的最简单方法是以声明方式填充它。像这样。

<asp:DropDownList ID="ddNewsOrEvents" runat="server" DataTextField="NewsTitle"
    DataValueField="newsID" 
    AppendDataBoundItems="true" DataSourceID="sqlNews">
    <asp:ListItem Value="-1" Text="News"></asp:ListItem>
    <asp:ListItem Value="0" Text="Event"></asp:ListItem>
</asp:DropDownList>
<asp:SqlDataSource ID="sqlNews" runat="server" ConnectionString="<%$ ConnectionStrings:MyConnectionFromWebConfig %>"
    SelectCommand="select newsID, newsTitle from dbo.tblNewsEvents where newsId=@newsID">
    <SelectParameters>
         <%--if newsID comes from some control --%>
        <asp:ControlParameter ControlID="someControl" PropertyName="someProperty" Name="newsID" Type="Int32" />
        <%--if newsId comes from querystring --%>
        <asp:QueryStringParameter QueryStringField="newsid" Name="newsID" Type="Int32" />
    </SelectParameters>
</asp:SqlDataSource>

不需要后面的代码。只需遵循 KISS 原则(Keep It Simple Stupid)

跟进
DropdownList控件的SelectedValue(Text)属性只有在控件为DataBound后才能设置。这意味着您可以设置SelectedValue='&lt;%#Eval("dataField")%&gt;',前提是它位于绑定容器中并且DropDownList 本身具有DataSourceID。否则你必须在DataBound 事件之后设置.SelectedValue

【讨论】:

  • 是的,它确实有Text,因为它继承了ListControl
  • 抱歉,Text 属性确实存在(继承),并且下拉列表与 SelectedValue 相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-21
  • 2017-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多