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 对象的参数。