checkListBox selectedindex和sql mapping

时间:2015-09-30 04:17:01

标签: c# sql-server

我的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而不是索引吗?

1 个答案:

答案 0 :(得分:1)

要了解表格流程,您可以查看此SQLFiddle。这将有助于您了解主表和事务表。

您的主要问题是您不了解控件的SelectedIndexSelectedValue属性之间的差异。那么你可以阅读完整的差异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;

然后你不会得到你正在看到的文本而不是你会得到那个整数值。

希望这对你有帮助..