我目前正在从事图书管理项目,我正在使用来自 Visual studio 的 sql 服务器,我在数据库中有图书类别 table
Iam currently working on a book managment project and im using sql server from Visual studio, I have Book Category table in the data base
我目前正在从事图书管理项目,我正在使用来自 Visual Studio 的 SQL 服务器。我在数据库中有一个图书类别 table,我正试图将它放在一个组合框中。
这是代码 - 我没有发现任何问题,但是类别在组合框中显示的时间太长了。
而且列表是重复的,可能是因为 while
循环?如果有,有什么办法可以解决吗?
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
try
{
con.ConnectionString = (@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\malek\source\repos\BookStore\BookStore\BOOKDB.mdf;Integrated Security=True");
scmd.Connection = con;
con.Open();
scmd.CommandText = "SELECT CATEGORY FROM BOOKCAT";
var rd = scmd.ExecuteReader();
while (rd.Read())
{
List.Add(Convert.ToString(rd[0]));
}
int i = 0;
while (i < List.LongCount())
{
comboBox1.Items.Add(List[i]);
i = i + 1;
}
}
catch (Exception EX)
{
MessageBox.Show(EX.Message);
}
finally
{
con.Close();
}
}
我错过了什么?
注意:我没有收到任何错误!!
根据您发布的代码,您似乎是在 comboBox1
的 SelectedIndexChanged
事件中从数据库加载类别。
因此,每次您从 comboBox1
中选择一个新项目时,您都在执行这段代码;您将转到数据库并从 BOOKCAT
table 加载所有内容,然后将这些项目放入 List
和 comboBox1
。这就是您看到重复类别的原因。这可能也是为什么一个类别在 ComboBox
.
中显示需要很长时间的原因
您可能不希望每次选定的索引更改时都从数据库加载 ComboBox
项,因此您应该在其他地方执行此操作。例如,您可以在 Form
的构造函数或 'Load' event.
中执行此操作
How do you mean with data binding?
像这样
var da = new SqlDataAdapter(
"SELECT DISTINCT CATEGORY FROM BOOKCAT ORDER BY CATEGORY"
@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\malek\source\repos\BookStore\BookStore\BOOKDB.mdf;Integrated Security=True"
);
var dt = new DataTable();
da.Fill(dt);
categoryComboBox.DisplayMember = "CATEGORY";
categoryComboBox.ValueMember = "CATEGORY";
categoryComboBox.DataSource = dt;
当你想要用户选择的东西时:
var cat = categoryComboBox.SelectedValue as string;
简单吧?
如果您使用强类型数据集,它会变得更加容易;为此,您只需将一个新的 DataSet 类型文件添加到您的项目(必须使用 net framework 而不是 net core/5+),将您的数据库拖到您的数据集中,向类别 TableAdapter 添加一个查询以获取不同的类别(如上所示) ) 然后打开数据源 window,将类别更改为组合并将其标记到表单上。无需编写代码; vs 会全部写出来
我目前正在从事图书管理项目,我正在使用来自 Visual Studio 的 SQL 服务器。我在数据库中有一个图书类别 table,我正试图将它放在一个组合框中。
这是代码 - 我没有发现任何问题,但是类别在组合框中显示的时间太长了。
而且列表是重复的,可能是因为 while
循环?如果有,有什么办法可以解决吗?
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
try
{
con.ConnectionString = (@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\malek\source\repos\BookStore\BookStore\BOOKDB.mdf;Integrated Security=True");
scmd.Connection = con;
con.Open();
scmd.CommandText = "SELECT CATEGORY FROM BOOKCAT";
var rd = scmd.ExecuteReader();
while (rd.Read())
{
List.Add(Convert.ToString(rd[0]));
}
int i = 0;
while (i < List.LongCount())
{
comboBox1.Items.Add(List[i]);
i = i + 1;
}
}
catch (Exception EX)
{
MessageBox.Show(EX.Message);
}
finally
{
con.Close();
}
}
我错过了什么?
注意:我没有收到任何错误!!
根据您发布的代码,您似乎是在 comboBox1
的 SelectedIndexChanged
事件中从数据库加载类别。
因此,每次您从 comboBox1
中选择一个新项目时,您都在执行这段代码;您将转到数据库并从 BOOKCAT
table 加载所有内容,然后将这些项目放入 List
和 comboBox1
。这就是您看到重复类别的原因。这可能也是为什么一个类别在 ComboBox
.
您可能不希望每次选定的索引更改时都从数据库加载 ComboBox
项,因此您应该在其他地方执行此操作。例如,您可以在 Form
的构造函数或 'Load' event.
How do you mean with data binding?
像这样
var da = new SqlDataAdapter(
"SELECT DISTINCT CATEGORY FROM BOOKCAT ORDER BY CATEGORY"
@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\malek\source\repos\BookStore\BookStore\BOOKDB.mdf;Integrated Security=True"
);
var dt = new DataTable();
da.Fill(dt);
categoryComboBox.DisplayMember = "CATEGORY";
categoryComboBox.ValueMember = "CATEGORY";
categoryComboBox.DataSource = dt;
当你想要用户选择的东西时:
var cat = categoryComboBox.SelectedValue as string;
简单吧?
如果您使用强类型数据集,它会变得更加容易;为此,您只需将一个新的 DataSet 类型文件添加到您的项目(必须使用 net framework 而不是 net core/5+),将您的数据库拖到您的数据集中,向类别 TableAdapter 添加一个查询以获取不同的类别(如上所示) ) 然后打开数据源 window,将类别更改为组合并将其标记到表单上。无需编写代码; vs 会全部写出来