C# 单击“新建用户”时选择“新建用户”;加上「;

C# 单击“新建用户”时选择“新建用户”;加上「;,c#,winforms,C#,Winforms,我有以下方法。我正在尝试这样做,当用户单击“添加”按钮时,新添加的用户将在名称组合框中被选中 private void AddUser() { string userQueryString = "SELECT[User_ID], [User_First_Name], [User_Surname] FROM[EquipmentTracker].[dbo].[Users]"; SqlConnection conn = new SqlConnection(constring);

我有以下方法。我正在尝试这样做,当用户单击“添加”按钮时,新添加的用户将在名称组合框中被选中

private void AddUser()
{
    string userQueryString = "SELECT[User_ID], [User_First_Name], [User_Surname] FROM[EquipmentTracker].[dbo].[Users]";
    SqlConnection conn = new SqlConnection(constring);
    SqlCommand commandRecipient = new SqlCommand(userQueryString, conn);
    conn.Open();

    SqlDataReader reader = commandRecipient.ExecuteReader();

    while (reader.Read())
    {
        User addUser = new User();
        addUser.userID = (int)reader["User_ID"];
        addUser.userName = (string)reader["User_First_Name"] + " " + (string)reader["User_Surname"];
        comboRecipient.Items.Add(addUser);
    }
}
在此之前,在我创建防止重新编写代码的方法之前,我是这样做的:

private void btnNewUser_Click(object sender, EventArgs e)
{
    Form2 newUser = new Form2();
    if(newUser.ShowDialog() == DialogResult.OK)
    {
        SqlConnection conn = new SqlConnection(constring);
        conn.Open();
        SqlCommand commandRecipient = new SqlCommand("SELECT [User_ID], [User_First_Name], [User_Surname] FROM [EquipmentTracker].[dbo].[Users]", conn);
        comboRecipient.Items.Clear();

        using (SqlDataReader reader = commandRecipient.ExecuteReader())
        {
            while (reader.Read())
            {
                int recipientID = (int)reader["User_ID"];
                string recipient = (string)reader["User_First_Name"] + " " + (string)reader["User_Surname"];
                comboRecipient.Items.Add(recipientID);
                comboRecipient.Items.Add(recipient);
                Console.WriteLine(String.Format("{0}", reader[0]));
            }
        }
        comboRecipient.SelectedItem = newUser.newUser;
    }
}
现在,我只是在这里调用该方法:

private void btnNewUser_Click(object sender, EventArgs e)
{
    Form2 newUser = new Form2();
    if(newUser.ShowDialog() == DialogResult.OK)
    {
        AddUser();
        comboRecipient.SelectedItem = newUser.newUser;
    }
}

您需要将组合框配置为使用您输入的
用户
对象的正确属性

以下是如何以编程方式执行此操作,例如在Form Load事件中:

comboRecipient.DisplayMember = "userName";  
comboRecipient.ValueMember = "userID";

或者您可以在表单设计器的
comboRecipient
属性中设置它。

您的问题有点让人困惑。您提到添加新用户,但实际上从未添加新用户。相反,AddUser只是从数据库中加载一些用户记录,并将它们添加到组合框中,然后依次选择每个记录。记录从数据库中出来的顺序决定了最后选择的顺序

解决方案有三个方面:

  • 在重新填充组合框项目列表之前,请清除该列表:
  • comboRecipient.Items.Clear()

    目前,每次调用AddUser时,都会重新添加所有用户

  • 对查询中的用户进行排序,以便最新的用户总是最后一个:
  • 从[EquipmentTracker].[dbo].[Users]中选择[Users\u ID],[Users\u First\u Name],[Users\u姓氏],按[Users\u ID]订购。

    这假设User_ID是一个自动递增的字段。如果您有一个
    CreationDate
    列,则可以使用该列

  • 添加所有项目后,选择组合框中的最后一项:
  • 而不是:

    comboRecipient.SelectedItem=newUser.newUser

    使用:

    这将选择组合框中的最后一个项目,只要组合框中有项目。如果没有项,则计算结果将为-1,这是组合框的有效索引(即使在使用数据绑定时也是如此)

    您可能还注意到组合框项目显示不正确。您可以通过以下设置来更正此问题:

    comboRecipient.DisplayMember = "userName";
    comboRecipient.ValueMember = "userID";
    

    这可以在任何地方设置,但值得在构造函数或加载事件处理程序中进行设置。

    为什么缺少
    comboRecipient.SelectedItem=newUser.newUser在新代码中?我不是,它在我最后一段代码中对AddUser()方法的调用下面?为什么要将用户对象添加到
    组合框
    ,而应该添加
    列表项
    ?form2做什么?正如我所看到的,没有“添加”操作,那么为什么要一次又一次地选择所有用户添加到组合中呢?作为一个旁注,有一些字段名,比如User\u First\u Name、User\u Last\u Name。。。在名为Users的表中,听起来是冗余的(不幸的是,有一些教程鼓励这样的命名约定)。
    comboRecipient.DisplayMember = "userName";
    comboRecipient.ValueMember = "userID";