为什么我的DropDownList不会填充Page_Load事件中的项目?

问题描述:

我有这样的控制来获取一些数据:为什么我的DropDownList不会填充Page_Load事件中的项目?

<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项目第一
  • 输入<%# Eval("newsEvent") %>本身,以查看它是否加载在页面,它会。

它还说:

如果下拉控件Text属性与指定数据源之前,任何价值分配,会出现此错误。

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

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

+0

显示页面加载方法。也许只是干净和重建,甚至重新启动,特别是如果您添加另一个服务器控件,并且无法从代码后面的代码访问该控件。 – Crowcoder

+0

@Crowcoder张贴 - 在重新开始? – davvv

+0

不要重新启动您的计算机以清除IIS Express。 – Crowcoder

正如我在评论中提到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 [email protected]"> 
    <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原则(ķ EEP 小号 imple 小号 tupid)

跟进
SelectedValueTextDropdownList控制的属性只能控制后设置为DataBound。这意味着您只能在装订容器中设置SelectedValue='<%#Eval("dataField")%>',并且DropDownList本身具有DataSourceID。否则你必须在DataBound事件后设置.SelectedValue

+0

是的,它确实有[Text](https://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.dropdownlist(v = vs.110).aspx),因为它继承了'ListControl' 。 – CodingYoshi

+0

对不起,'Text'属性确实存在(继承),下拉与'SelectedValue'相同。 –