我的Windows窗体应用程序中有一个组合框和一个checkListbox。在我的组合框中,我使用此查询将我的项目映射到我的sql表并将其显示在我的组合框中
select * from job_table
SQL表
job_detail
--------------------
jobId | jobName
-------------------
1 | McDonald
2 | Buger King
3 | Security Officer
4 | IT Manager
5 | Teacher
代码:
string query = "select jobId, jobName from job_detail";
SqlDataAdapter da = new SqlDataAdapter();
myConn.Open();
DataTable dt = new DataTable();
SqlCommand command = new SqlCommand(query, myConn);
SqlDataReader reader = command.ExecuteReader();
dt.Load(reader);
DataRow dr;
dr= dt.NewRow();
dr.ItemArray = new object[] { 0, "<----------Select a job -------> " };
dt.Rows.InsertAt(dr, 0);
applicationComboBox.DataSource = dt;
applicationComboBox.ValueMember = "jobId";
applicationComboBox.DisplayMember = "jobName";
在comboBox绑定之后,我调用一个方法调用fill_workerCheckList来显示当前在该作业上的worker列表。
-----------------------------
workerId | workerName |
-----------------------------
1 | Amy |
2 | Jim |
3 | Peter |
4 | Pam |
5 | David |
6 | Sara |
7 | Laura |
8 | Bob |
我加入了两个表来获得他们的关系:1-N:1个工人可以使用这个连接查询有很多工作:
select * from worker_detail as wd
LEFT JOIN job_detail as jd
ON wd.jobId = jd.jobId
-----------------------------------------
workerId | workerName | jobId
------------------------------------------
1 | Amy | 1
2 | Jim | 1
3 | Peter | 2
4 | Pam | 5
5 | David | 3
6 | Sara | 2
7 | Laura | 4
8 | Bob | 4
要将workerName显示到checkListBox,我想通过comboBox.selectedIndex进行过滤,但这不是一个好主意,因为如果1个作业被删除会发生什么,而不是所有记录都会搞砸
这是我想到的使用SQL注入的查询
select * from worker_detail as wd
LEFT JOIN job_detail as jd
ON wd.jobId = jd.jobId where wd.jobId = '"+comboBox.SelectedIndex+"'
我的原始代码:
SqlCommand myCommand = new SqlCommand(query, myConn);
SqlDataReader dr = myCommand.ExecuteReader();
comboBox.Items.Clear();
string s = "Select All";
comboBox.Items.Add(s);
while (dr.Read())
{
string workerName = dr.IsDBNull(1) ? string.Empty : dr.GetString(1);
checkListBox.Items.Add(name);
}
您可以在此处立即看到问题。如果工作以某种方式被削减怎么办?然后jobId消失了,comboBox索引也不起作用。我想知道的是有更好的方法来映射workerId而不是索引吗?
答案 0 :(得分:1)
要了解表格流程,您可以查看此SQLFiddle。这将有助于您了解主表和事务表。
您的主要问题是您不了解控件的SelectedIndex
和SelectedValue
属性之间的差异。那么你可以阅读完整的差异here,但是为了你的参考,让我添加重要的内容作为答案。
<强>的SelectedIndex 强>
SelectedIndex属性始终返回控件中所选项的索引。索引始终从0开始。控件中的第一项具有0索引,第二项具有1索引,依此类推。
<强>的SelectedValue 强>
嗯,这是人们最困惑的财产。他们中的大多数人认为SelectedValue属性返回我们选择的项目的文本。是的,只有在未单独指定值时才返回文本BUT。这些控件中的值是未向用户显示的内容。 让我们举一个例子,您将项目动态添加到ListBox1中,如 -
ListBox1.Items.Add("iknowledgeboy");
当你这样做时,这个项目的文字和价值变成了#34; iknowledgeboy&#34;。所以,当你说 -
ListBox1.SelectValue;
然后你会得到&#34; iknowledgeboy&#34;当然。但是当您将ListBox1与数据库绑定时,则需要指定DataTextField,以及ListBox1的DataValueField。那时,ListBox1或Dropdown或CheckBoxList或RadioButtonList中每个项的值通常是整数。那么,如果你说 -ListBox1.SelectedValue;
然后你不会得到你正在看到的文本而不是你会得到那个整数值。
希望这对你有帮助..