从数据库中填充下拉列表的正确方法是什么?

47
我正在从 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();
    }
}
4个回答

100
你可以将DropDownList绑定到数据源(DataTable,List,DataSet,SqlDataSource等)。
例如,如果你想要使用一个DataTable:
ddlSubject.DataSource = subjectsTable;
ddlSubject.DataTextField = "SubjectNamne";
ddlSubject.DataValueField = "SubjectID";
ddlSubject.DataBind();

编辑 - 更完整的示例

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

}

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

<asp:DropDownList ID="ddlSubject" runat="server" AppendDataBoundItems="true">
    <asp:ListItem Text="<Select Subject>" Value="0" />
</asp:DropDownList>
你可以在代码后台将DropDownList绑定到数据源中(只需记住删除: )。
ddlSubject.Items.Insert(0, new ListItem("<Select Subject>", "0"));

从代码后台处理程序中添加,否则你将会有两个 "" 项。


2
这比逐个添加下拉列表项更好的方式。 - Arjun Shetty
2
@andromeda - 是的,在我的例子中subjectsTable是一个DataTable。我已经更新了我的答案,包括一个完整的例子。 - Tim
4
抱歉,我错过了那部分。我已经在我的回答中更新了代码示例。如果需要的话,您还可以在Markdown中添加像那样的“静态”选项,只需确保将DropDownList的AppendDataBoundItems属性设置为true即可。 - Tim
1
是的,因为使用了using语句。请参阅using语句(C#参考) - Tim
2
@SearchForKnowledge - 在查询中使用ORDER BY子句。例如:SELECT SubjectID, SubjectName FROM Students.dbo.Subjects ORDER BY SubjectName ASC - 这将按照SubjectName升序排列结果。 - Tim
显示剩余4条评论

15

我希望我没有过于强调显而易见的事实,但为什么不直接在ASP端完成呢?除非您根据程序中的某些条件动态地修改SQL,否则应尽可能避免使用codebehind。

您可以在ASP直接使用SqlDataSource控件和下拉列表中的属性来完成上述操作,而无需使用codebehind。

<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>

我觉得这是做这件事的“正确方式”。我还必须指定连接字符串,更多信息请参见此处:https://msdn.microsoft.com/zh-cn/library/w1kdt8w2(v=vs.140).aspx - Aralox
1
回应“为什么不直接在ASP端完成?”的问题,其中一个原因是您需要在与默认时间不同的时间绑定下拉列表。如果设置了DataSourceID,则数据绑定会在PreRender事件之后发生。 - Tony L.
不使用try/catch连接数据库被认为是一种不好的做法吗? - Kajbo
@Kajbo - 不是在这种情况下。如果你想在C#中模仿上面的逻辑,那么我同意你 - try/catch是必不可少的。 - Fandango68

2
public void getClientNameDropDowndata()
{
    getConnection = Connection.SetConnection(); // to connect with data base Configure manager
    string ClientName = "Select  ClientName from Client ";
    SqlCommand ClientNameCommand = new SqlCommand(ClientName, getConnection);
    ClientNameCommand.CommandType = CommandType.Text;
    SqlDataReader ClientNameData;
    ClientNameData = ClientNameCommand.ExecuteReader();
    if (ClientNameData.HasRows)
    {
        DropDownList_ClientName.DataSource = ClientNameData;
        DropDownList_ClientName.DataValueField = "ClientName";
        DropDownList_ClientName.DataTextField="ClientName";
        DropDownList_ClientName.DataBind();
    }
    else
    {
        MessageBox.Show("No is found");
        CloseConnection = new Connection();
        CloseConnection.closeConnection(); // close the connection 
    }
}

9
有没有可能解释一下这段代码,这样后来的人就可以学习为什么它是问题的答案? - Andrew Barber

-1
((TextBox)GridView1.Rows[e.NewEditIndex].Cells[3].Controls[0]).Enabled = false;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接