从数据库填充DropDownList的正确方法是什么?

dev*_*ull 46 c# asp.net sql-server-2008

我正在从SQL Server数据库填充DropDownList,如下所示.它工作正常,但我不确定这是一个好方法.有人可以对这种方法有所了解,并给出一些改进吗?

private void LoadSubjects()
{
    ddlSubjects.Items.Clear();
    string selectSQL = "SELECT SubjectID,SubjectName FROM Students.dbo.Subjects";

    SqlConnection con = new SqlConnection(connectionString);
    SqlCommand cmd = new SqlCommand(selectSQL, con);
    SqlDataReader reader;

    try
    {
        ListItem newItem = new ListItem();
        newItem.Text = "<Select Subject>";
        newItem.Value = "0";
        ddlSubjects.Items.Add(newItem);

        con.Open();
        reader = cmd.ExecuteReader();
        while (reader.Read())
        {
            newItem = new ListItem();
            newItem.Text = reader["SubjectName"].ToString();
            newItem.Value = reader["SubjectID"].ToString();
            ddlSubjects.Items.Add(newItem);
        }
        reader.Close();
    }
    catch (Exception err)
    {
        //TODO
    }
    finally
    {
        con.Close();
    }
}
Run Code Online (Sandbox Code Playgroud)

Tim*_*Tim 98

您可以将DropDownList绑定到数据源(DataTable,List,DataSet,SqlDataSource等).

例如,如果您想使用DataTable:

ddlSubject.DataSource = subjectsTable;
ddlSubject.DataTextField = "SubjectNamne";
ddlSubject.DataValueField = "SubjectID";
ddlSubject.DataBind();
Run Code Online (Sandbox Code Playgroud)

编辑 - 更完整的例子

private void LoadSubjects()
{

    DataTable subjects = new DataTable();

    using (SqlConnection con = new SqlConnection(connectionString))
    {

        try
        {
            SqlDataAdapter adapter = new SqlDataAdapter("SELECT SubjectID, SubjectName FROM Students.dbo.Subjects", con);
            adapter.Fill(subjects);

            ddlSubject.DataSource = subjects;
            ddlSubject.DataTextField = "SubjectNamne";
            ddlSubject.DataValueField = "SubjectID";
            ddlSubject.DataBind();
        }
        catch (Exception ex)
        {
            // Handle the error
        }

    }

    // Add the initial item - you can add this even if the options from the
    // db were not successfully loaded
    ddlSubject.Items.Insert(0, new ListItem("<Select Subject>", "0"));

}
Run Code Online (Sandbox Code Playgroud)

要通过标记而不是代码隐藏来设置初始值,请指定选项并将AppendDataBoundItems属性设置为true:

<asp:DropDownList ID="ddlSubject" runat="server" AppendDataBoundItems="true">
    <asp:ListItem Text="<Select Subject>" Value="0" />
</asp:DropDownList>
Run Code Online (Sandbox Code Playgroud)

然后,您可以将DropDownList绑定到代码隐藏中的DataSource(只需记住删除:

ddlSubject.Items.Insert(0, new ListItem("<Select Subject>", "0"));
Run Code Online (Sandbox Code Playgroud)

从代码隐藏,或者你将有两个""项目.

  • @andromeda - 抱歉,我错过了那一部分.我在答案中更新了代码示例.如果需要,您还可以在markdown中添加这样的"静态"选项,只需确保将DropDownList的AppendDataBoundItems属性设置为true即可. (4认同)
  • 这比将项目单独添加到下拉列表更好. (2认同)
  • @andromeda - 是的,在我的例子中,subjectTable是一个DataTable.我已经更新了我的答案,包括一个完整的例子. (2认同)
  • @SearchForKnowledge - 在查询中使用`ORDER BY`子句.例如:`SELECT SubjectID,SubjectName FROM Students.dbo.Subjects ORDER BY SubjectName ASC` - 这将按SubjectName按升序排序结果. (2认同)

Fan*_*o68 15

我希望我不夸大显而易见的事,但为什么不直接在ASP方面呢?除非您根据程序中的某些条件动态更改SQL,否则应尽可能避免代码隐藏.

您可以直接在ASP中使用SqlDataSource控件和下拉列表中的属性直接执行上述所有操作.

<asp:GridView ID="gvSubjects" runat="server" DataKeyNames="SubjectID" OnRowDataBound="GridView_RowDataBound" OnDataBound="GridView_DataBound">
    <Columns>
        <asp:TemplateField HeaderText="Subjects">
            <ItemTemplate>
                <asp:DropDownList ID="ddlSubjects" runat="server" DataSourceID="sdsSubjects" DataTextField="SubjectName" DataValueField="SubjectID">
                </asp:DropDownList>
                <asp:SqlDataSource ID="sdsSubjects" runat="server"
                    SelectCommand="SELECT SubjectID,SubjectName FROM Students.dbo.Subjects"></asp:SqlDataSource>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>
Run Code Online (Sandbox Code Playgroud)