我有以下方法。我试图这样做,以便当用户单击“添加”按钮时,在名称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;
}
}
答案 0 :(得分:0)
您需要配置ComboBox以使用要馈送的User
对象中的正确属性。
这里是如何以编程方式进行操作,例如在表单加载事件中:
comboRecipient.DisplayMember = "userName";
comboRecipient.ValueMember = "userID";
或者您可以在表单设计器的comboRecipient
的属性中进行设置。
答案 1 :(得分:0)
您的问题有点令人困惑。您提到添加新用户,但实际上从未添加过新用户。相反,AddUser只是从数据库中加载了许多用户记录,并将它们添加到组合框中,然后依次选择每个用户记录。从数据库中取出记录的顺序是哪个,最后确定选择哪个。
修复方法有三点:
comboRecipient.Items.Clear();
按现状,每次调用AddUser时,都会再次重新添加所有用户。
SELECT [User_ID], [User_First_Name], [User_Surname] FROM [EquipmentTracker].[dbo].[Users] ORDER BY [User_ID]
这假定User_ID是一个自动递增的字段。如果您有CreationDate
列,则可以使用它。
代替:
comboRecipient.SelectedItem = newUser.newUser;
使用:
comboRecipient.SelectedIndex = comboRecipient.Items.Count - 1
这将选择组合框中的最后一项,只要组合框中有项目即可。如果没有项目,则计算结果将为-1,这是组合框的有效索引(即使使用数据绑定时也是如此)。
您可能还会注意到组合框项目显示不正确。您可以通过以下方法进行纠正:
comboRecipient.DisplayMember = "userName";
comboRecipient.ValueMember = "userID";
可以在任何地方进行设置,但是值得在构造函数或Load事件处理程序中进行设置。