我在SQL Server中有一个表,如下所示:
ID Code Name Surname 1 MS Mike Smith 2 JD John Doe 3 UP Unknown Person
等等...
现在我想以这种方式将来自此表的数据绑定到ComboBox中,在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将为我自动完成代码.
但是,我想在组合框的顶部放置一个标签,以显示当前所选用户代码的名称和姓氏.
我的观点是这样的:"所以,我需要找到一个事件,它将在组合框中更改代码后启动,在那种情况下,我将获得当前的DataRow ..."
我正在浏览组合框的事件,尝试了很多但没有成功.
例如:
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中的数据选择有关的问题.现在,当我在组合框中输入内容时,它允许我输入列表中不存在的字母.例如,我开始输入"J",而不是用"D"结束,所以我会有"JD",我输入"Jsomerandomtexthere".Combobox将允许,但列表中不存在此类项目.换句话说,我希望组合框防止用户输入代码列表中没有的代码.