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

C# 从数据库填充DropDownList的正确方法是什么?,c#,asp.net,sql-server-2008,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 S

我正在从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();
    }
}
private void LoadSubjects()
{
ddl subjects.Items.Clear();
string selectSQL=“从Students.dbo.Subjects中选择SubjectID、SubjectName”;
SqlConnection con=新的SqlConnection(connectionString);
SqlCommand cmd=newsqlcommand(选择sql,con);
SqlDataReader;
尝试
{
ListItem newItem=新ListItem();
newItem.Text=“”;
newItem.Value=“0”;
ddl subjects.Items.Add(newItem);
con.Open();
reader=cmd.ExecuteReader();
while(reader.Read())
{
newItem=新列表项();
newItem.Text=reader[“SubjectName”].ToString();
newItem.Value=reader[“SubjectID”].ToString();
ddl subjects.Items.Add(newItem);
}
reader.Close();
}
捕获(异常错误)
{
//待办事项
}
最后
{
con.Close();
}
}

您可以将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"));

}
private void LoadSubjects()
{
DataTable主题=新DataTable();
使用(SqlConnection con=newsqlconnection(connectionString))
{
尝试
{
SqlDataAdapter=newSqlDataAdapter(“从Students.dbo.Subjects中选择SubjectID,SubjectName”,con);
a.填写(受试者);
ddlSubject.DataSource=主题;
ddlSubject.DataTextField=“SubjectNamne”;
ddlSubject.DataValueField=“SubjectID”;
ddlSubject.DataBind();
}
捕获(例外情况除外)
{
//处理错误
}
}
//添加初始项-您可以添加此项,即使
//数据库未成功加载
ddlSubject.Items.Insert(0,新列表项(“,“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"));
ddlSubject.Items.Insert(0,新列表项(“,“0”);

从代码隐藏中删除,否则您将有两个“”项。

我希望我没有夸大显而易见的内容,但为什么不直接在ASP端执行此操作呢?除非您根据程序中的某些条件动态更改SQL,否则应尽可能避免代码隐藏

您可以在ASP中直接执行上述操作,而无需使用SqlDataSource控件和dropdownlist中的属性编写代码

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


这是一种比将项目单独添加到dropdownlist更好的方法。@andromeda-是的,在我的示例中subjectsTable是一个数据表。我更新了答案,以包含一个完整的示例。@andromeda-很抱歉,我遗漏了那部分。我已更新了答案中的代码示例。您还可以添加“静态”如果需要,可以在标记中使用类似的选项,只需确保您将DropDownList的AppendDataBoundItems属性设置为true。是的,因为using语句。请参阅查询中的@SearchForkKnowledge-User
ORDER BY
子句。例如:
SELECT SubjectID,SubjectName FROM Students.dbo.Subjects ORDER BY SubjectName ASC
-这将按SubjectName按升序排列结果。您是否可以解释此代码,以便稍后有人可以了解为什么这是问题的答案?我觉得这是一种“正确的方式”。我还必须指定连接字符串,更多信息请参见:响应“为什么不直接在ASP端执行此操作?”一个原因是,您需要在不同于默认值的时间使用下拉列表进行数据绑定。如果设置了DataSourceID,则数据绑定将在PreRender事件之后进行。如果不使用try/catch连接到数据库,是否被认为是不好的做法?@Kajbo-在这种情况下不是。如果您在C#中模仿上述相同的逻辑,则是的,我同意您的看法-试一试/抓一抓至关重要。
((TextBox)GridView1.Rows[e.NewEditIndex].Cells[3].Controls[0]).Enabled = false;
<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>