我在 SQL Server 中有一个表,它看起来像这样:
ID Code Name Surname
1 MS Mike Smith
2 JD John Doe
3 UP Unknown Person
现在,我想以一种方式将此表中的数据绑定到ComboBox中,使得在ComboBox中显示来自Code列的值。
我是这样进行绑定的:
等等...
在ComboBox中,我将显示来自Code列的值。
我是这样进行绑定的:
SqlDataAdapter sqlAdapter = new SqlDataAdapter("SELECT * FROM dbo.Users ORDER BY Code", MainConnection);
sqlAdapter.Fill(dsUsers, "Users");
cbxUsers.DataSource = dsUsers.Tables["Users"];
cmUsers = (CurrencyManager)cbxUsers.BindingContext[dsUsers.Tables["Users"]];
cbxUsers.DisplayMember = "Code";
这段代码似乎有效。我可以滚动代码列表。此外,我可以手动编写代码,ComboBox会为我自动完成代码。
然而,我想在组合框顶部放置一个标签,以显示当前选定的用户代码的名字和姓氏。
我的思路是:“因此,我需要找到一个事件,在组合框中更改代码后触发该事件,并在该事件中获取当前数据行……”
我正在浏览组合框的事件,尝试了许多事件,但没有成功。
例如:
private void cbxUsers_SelectionChangeCommitted(object sender, EventArgs e)
{
if (cmUsers != null)
{
DataRowView drvCurrentRowView = (DataRowView)cmUsers.Current;
DataRow drCurrentRow = drvCurrentRowView.Row;
lblNameSurname.Text = Convert.ToString(drCurrentRow["Name"]) + " " + Convert.ToString(drCurrentRow["Surname"]);
}
}
这给了我奇怪的结果。首先,当我通过鼠标滚轮滚动时,它没有返回我期望获得的行。例如,在JD上它显示“Mike Smith”,在MS上它显示“John Doe”,在UP上它再次显示“Mike Smith”!另一个问题是,当我开始在ComboBox中输入并按下Enter键时,它不会触发事件。
然而,当我以这种方式将数据绑定到lblNameSurname.Text时,一切都按预期工作:
lblNameSurname.DataBindings.Add("Text", dsusers.Tables["Users"], "Name");
问题在于我只能绑定一个列,但我想要两个。我不想使用两个标签(一个用于显示名字,另一个用于显示姓氏)。
那么,有什么解决办法吗?
此外,我有一个关于ComboBox中数据选择的问题。现在,当我在ComboBox中输入内容时,它允许我输入列表中不存在的字母。
例如,我开始输入“J”,但最后输入了“Jsomerandomtexthere”而不是“JD”。ComboBox会允许这样做,但列表中并没有这样的项目。换句话说,我希望ComboBox阻止用户输入不在代码列表中的代码。