点击“添加”时选择新用户

时间:2018-11-05 15:31:46

标签: c# winforms

我有以下方法。我试图这样做,以便当用户单击“添加”按钮时,在名称comboBox中选择新添加的用户。

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;
    }
}

2 个答案:

答案 0 :(得分:0)

您需要配置ComboBox以使用要馈送的User对象中的正确属性。

这里是如何以编程方式进行操作,例如在表单加载事件中:

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

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

答案 1 :(得分:0)

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

修复方法有三点:

  1. 在重新填充组合框项目列表之前,请清除它:

comboRecipient.Items.Clear();

按现状,每次调用AddUser时,都会再次重新添加所有用户。

  1. 对查询中的用户进行排序,以使最新的用户始终排在最后:

SELECT [User_ID], [User_First_Name], [User_Surname] FROM [EquipmentTracker].[dbo].[Users] ORDER BY [User_ID]

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

  1. 添加所有项目后,选择组合框中的最后一项:

代替:

comboRecipient.SelectedItem = newUser.newUser;

使用:

    comboRecipient.SelectedIndex = comboRecipient.Items.Count - 1

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

您可能还会注意到组合框项目显示不正确。您可以通过以下方法进行纠正:

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

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