C# 在 "SelectedIndexChanged" 事件的 label.Text 属性 中显示 sql 数据库对象的名称
C# Displaying a sql database object's name in a label.Text property on "SelectedIndexChanged" Event
我正在尝试制作一个小的通讯录,它从 mssql database.It 中获取联系人详细信息有 3 个 tables: 联系人,last_talk(上次我与联系人交谈+讨论的简短描述)和另一个 table(具有前 2 tables 中的两个主键)
在我显示联系人的表单(tabcontrol 的选项卡)上,我添加了 2 个列表框,一个加载并显示联系人姓名,第二个列表框为每个联系人加载 "Last talk" 列表 select 取决于我有多少 "talks" 联系人。
我现在想做的是:当我 select 一个联系人时,我还想在列表框附近显示一些联系人姓名、公司等的标签,将其文本更改为selected 联系人的 name/company...
的数据库条目
部分代码如下:
private void lstContactList_SelectedIndexChanged(object sender, EventArgs e)
{
PopulateTalkList();
PopulateContactLabels();
}
private void ContactBookForm_Load(object sender, EventArgs e)
{
PopulateContactList();
}
private void PopulateContactList()
{
string query = "SELECT * FROM Contact";
using (connection = new SqlConnection(connectionString))
using (SqlDataAdapter adapter = new SqlDataAdapter(query, connection))
{
connection.Open();
DataTable contactTable = new DataTable();
adapter.Fill(contactTable);
lstContactList.DisplayMember = "Name";
lstContactList.ValueMember = "Id";
lstContactList.DataSource = contactTable;
}
}
这是我尝试用来更改标签的方法:
private void PopulateContactLabels()
{
string query = "SELECT * FROM Contact";
using (connection = new SqlConnection(connectionString))
using (SqlCommand command = new SqlCommand(query, connection))
using (SqlDataAdapter adapter = new SqlDataAdapter(command))
{
connection.Open();
SqlDataReader rdr = command.ExecuteReader();
while (rdr.Read())
{
lblContactName.Text = rdr["Name"].ToString();
lblCompany.Text = rdr["Company"].ToString();
lblOccupation.Text = rdr["Occupation"].ToString();
lblPhoneNumber.Text = rdr["PhoneNumber"].ToString();
lblEmail.Text = rdr["Email"].ToString();
}
rdr.Close();
connection.Close();
}
}
它确实会更改标签,但它 select 是添加到数据库中的最后一个联系人,并且当我 select 另一个联系人时它不会更改。
我做错了什么?
那是因为在您的 PopulateContactLabels
方法中,您选择了整个联系人 table,然后通读了整个列表,所以它始终是最后一个显示的。
您需要一个更像 SELECT * FROM Contact WHERE ContactId = @contactID
的查询,然后将 contactId(或您用来查找联系人的任何值)添加为 SqlCommand
对象的参数。
我正在尝试制作一个小的通讯录,它从 mssql database.It 中获取联系人详细信息有 3 个 tables: 联系人,last_talk(上次我与联系人交谈+讨论的简短描述)和另一个 table(具有前 2 tables 中的两个主键)
在我显示联系人的表单(tabcontrol 的选项卡)上,我添加了 2 个列表框,一个加载并显示联系人姓名,第二个列表框为每个联系人加载 "Last talk" 列表 select 取决于我有多少 "talks" 联系人。
我现在想做的是:当我 select 一个联系人时,我还想在列表框附近显示一些联系人姓名、公司等的标签,将其文本更改为selected 联系人的 name/company...
的数据库条目部分代码如下:
private void lstContactList_SelectedIndexChanged(object sender, EventArgs e)
{
PopulateTalkList();
PopulateContactLabels();
}
private void ContactBookForm_Load(object sender, EventArgs e)
{
PopulateContactList();
}
private void PopulateContactList()
{
string query = "SELECT * FROM Contact";
using (connection = new SqlConnection(connectionString))
using (SqlDataAdapter adapter = new SqlDataAdapter(query, connection))
{
connection.Open();
DataTable contactTable = new DataTable();
adapter.Fill(contactTable);
lstContactList.DisplayMember = "Name";
lstContactList.ValueMember = "Id";
lstContactList.DataSource = contactTable;
}
}
这是我尝试用来更改标签的方法:
private void PopulateContactLabels()
{
string query = "SELECT * FROM Contact";
using (connection = new SqlConnection(connectionString))
using (SqlCommand command = new SqlCommand(query, connection))
using (SqlDataAdapter adapter = new SqlDataAdapter(command))
{
connection.Open();
SqlDataReader rdr = command.ExecuteReader();
while (rdr.Read())
{
lblContactName.Text = rdr["Name"].ToString();
lblCompany.Text = rdr["Company"].ToString();
lblOccupation.Text = rdr["Occupation"].ToString();
lblPhoneNumber.Text = rdr["PhoneNumber"].ToString();
lblEmail.Text = rdr["Email"].ToString();
}
rdr.Close();
connection.Close();
}
}
它确实会更改标签,但它 select 是添加到数据库中的最后一个联系人,并且当我 select 另一个联系人时它不会更改。
我做错了什么?
那是因为在您的 PopulateContactLabels
方法中,您选择了整个联系人 table,然后通读了整个列表,所以它始终是最后一个显示的。
您需要一个更像 SELECT * FROM Contact WHERE ContactId = @contactID
的查询,然后将 contactId(或您用来查找联系人的任何值)添加为 SqlCommand
对象的参数。