从数据库中的表填充一个组合框
本文关键字:一个 组合 数据库 填充 | 更新日期: 2023-09-27 17:50:13
我有一个名为combobox1
的组合框,我想用id
作为值和Name
作为显示名称填充它。我搜索并阅读了一些教程,发现这段代码在表单加载事件中使用,但它不填充列表。我看到一个空的下拉框。知道我哪里错了吗?
在我的数据库类中,我有这个函数
public static void FillDropDownList(string Query, System.Windows.Forms.ComboBox DropDownName)
{
SqlDataReader dr;
SqlConnection myConnection = new SqlConnection(CONNECTION_STRING);
try
{
myConnection.Open();
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
// Check whether the Drop Down has existing items. If YES, empty it.
if (DropDownName.Items.Count > 0)
DropDownName.Items.Clear();
SqlCommand cmd = new SqlCommand(Query, myConnection);
dr = cmd.ExecuteReader();
while (dr.Read())
DropDownName.Items.Add(dr[0].ToString());
Console.Write(DropDownName.Items.Add(dr[0].ToString()));
dr.Close();
}
在我的表单中我称之为
private void sales_record_Load(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(DBUtils.CONNECTION_STRING);
DBUtils.FillDropDownList("select id,Name from Farms", comboBox1);
}
这应该符合您的要求。从设计的角度来看,我看到的问题是,任何为此编写查询代码的人都需要意识到,返回的前两列需要分别反映ID和显示项。除此之外,实际的列名并不重要,因为ValueMember和DisplayMember属性(数据源中每个列的字符串名称)是通过对column[0]和column[1]的顺序引用获得的。
注意,我在using块中包装了每个DataAccess对象(SQLConnection实例和SQLCommand实例)。这是数据访问对象的推荐实践,因为数据访问对象往往会消耗非托管资源,需要进行处置。using块为您处理每个对象的处置。注意,每个using块都包含自己的作用域。
希望有帮助!
更新:@Neolisk在我写我的答案时发布了他的答案。虽然它们不是重复的,但它们涵盖了很多相同的领域。在他的回答和这个之间,你应该有你需要的了!
public void FillDropDownList(string Query, ComboBox DropDownName)
{
// If you use a DataTable (or any object which implmenets IEnumerable)
// you can bind the results of your query directly as the
// datasource for the ComboBox.
DataTable dt = new DataTable();
// Where possible, use the using block for data access. The
// using block handles disposal of resources and connection
// cleanup for you:
using (var cn = new SqlConnection(CONNECTION_STRING))
{
using(var cmd = new SqlCommand(Query, cn))
{
cn.Open();
try
{
dt.Load(cmd.ExecuteReader());
}
catch (SqlException e)
{
// Do some logging or something.
MessageBox.Show("There was an error accessing your data. DETAIL: " + e.ToString());
}
}
}
DropDownName.DataSource = dt;
DropDownName.ValueMember = dt.Columns[0].ColumnName;
DropDownName.DisplayMember = dt.Columns[1].ColumnName;
}
我的建议-尽可能使用。net内置功能,不要手动处理数据绑定(这是你在代码中尝试做的):
- 使用ExecuteQuery从数据库中提取数据表
- DropDownName设置。DataSource = yourDataTable.
- DropDownName设置。ValueMember = "id".
- DropDownName设置。DisplayMember = "Name".
public static void FillDropDownList(string Query, System.Windows.Forms.ComboBox DropDownName)
{
DataTable dt;
using (var cn = new SqlConnection(CONNECTION_STRING))
{
cn.Open();
try
{
SqlCommand cmd = new SqlCommand(Query, cn);
dt = cmd.ExecuteQuery();
}
catch (SqlException e)
{
Console.WriteLine(e.ToString());
return;
}
}
DropDownName.DataSource = dt;
DropDownName.ValueMember = "id";
DropDownName.DisplayMember = "Name";
}
注意我如何将异常类型更改为SqlException
,因此我们只查找数据库错误。其他的都会爆炸。我不记得myConnection.Open();
会抛出异常的任何情况,所以你的try块不是很有用。注意在我的try子句中-它里面有ExecuteQuery
,这很可能失败。
EDIT:使用using
结构时,不需要关闭finally
块中的连接。因此,它可以被删除-并且您的代码变得更加紧凑。
我能够使用@Neolisk的代码使其工作。只对代码做了一些小改动,如下:
public static void FillDropDownList(string Query, System.Windows.Forms.ComboBox DropDownName)
{
using (var cn = new SqlConnection(CONNECTION_STRING))
{
cn.Open();
DataTable dt = new DataTable();
try
{
SqlCommand cmd = new SqlCommand(Query, cn);
SqlDataReader myReader = cmd.ExecuteReader();
dt.Load(myReader);
}
catch (SqlException e)
{
Console.WriteLine(e.ToString());
return;
}
DropDownName.DataSource = dt;
DropDownName.ValueMember = "id";
DropDownName.DisplayMember = "Name";
}
}