为什么我的DropDownList没有填充Page_Load事件中的Items?

时间:2017-09-09 10:45:12

标签: c# asp.net webforms

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

<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();

                        }   

                    }


        }

我的编译器说:名称&#39; newsOrEvent&#39;在当前上下文中不存在

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项目
  • 单独输入<%# Eval("newsEvent") %>以查看它是否在页面中加载。

它还说:

  

如果在分配数据源之前为下拉控件Text属性分配了任何值,则会发生此错误。

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

我看不出为什么DropDownList没有填充。

1 个答案:

答案 0 :(得分:0)

正如我在评论中提到的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原则( K eep t S 实施 S tupid)

跟进
控件 SelectedValue 后,才能设置TextDropdownListDataBound控件的SelectedValue='<%#Eval("dataField")%>'属性。这意味着只有DropDownList位于绑定容器中且DataSourceID本身具有.SelectedValue时才能设置DataBound。否则,您必须在createUser(user: User){ let headers = new Headers({ 'Content-Type': 'application/json' }); let options = new RequestOptions({ headers: headers }); return this.http.post(this.url, user, options).map((response: Response) => response.json());} 事件后设置/a/*