c# 从组合框 SQL 填充检查列表框

c# fill checkelistbox from combobox SQL

我在 c# 中有 ha winform 应用程序 从 SQL 服务器数据库获取值。 我可以获得我想要在 combobox 中显示的值,但是根据 selection 的不同,我想在 checkedcombobox 中显示相应的 sql 行供用户使用select想要的那个。 我的代码是:(填充组合框)

    SqlDataAdapter SDA = new SqlDataAdapter("select distinct desempenho from vidros", con);
    DataTable DTT = new DataTable();
    SDA.Fill(DTT);
    desempenho.Items.Clear();
    foreach (DataRow ROW in DTT.Rows)
    {
        desempenho.Items.Add(ROW["desempenho"].ToString());
    }

并且:(在选中的组合框中显示 selected 行) 不起作用。

 private void checkedListBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            SqlDataAdapter sda = new SqlDataAdapter("select desc from vidros where desempenho ='" + desempenho.Text + "'", con);
            DataTable DTT = new DataTable();
            sda.Fill(DTT);
            checkedListBox1.Items.Clear();
            foreach (DataRow AB in DTT.Rows)
            {
                checkedListBox1.Items.Add(AB["desc"].ToString());
            }
        }

这是为用户提供多项选择的最佳方式吗? 有谁知道代码可能有什么问题?

提前致谢。

这个错误迟早会发生在每个人身上。

DESC 是几乎所有现有数据库系统中的保留关键字。它在 ORDER BY 子句中用于使结果降序排列。

因此,如果您确实有一个以这种方式命名的字段(最好尽快更改该名称),您需要将其包含在转义字符中(Sql 服务器使用方括号)

SqlDataAdapter sda = new SqlDataAdapter(@"select [desc] 
       from vidros where desempenho ='" + desempenho.Text + "'", con);

说我也推荐使用参数化查询。在您的情况下,您应该相对安全,但最好完全避免 sql 注入

的任何可能性
SqlDataAdapter sda = new SqlDataAdapter(@"select [desc] 
       from vidros where desempenho = @emp", con);
sda.SelectCommand.Parameters.Add("@emp", SqlDbType.NVarChar).Value = desempenho.Text;
 .....

看来绑定列表框的代码放错了地方。 如果你想根据combobox的选中项绑定listbox,你需要在combobox的SelectedIndexChanged事件中写这个逻辑。

如果您将代码移动到组合框的 SelectedIndexChanged 事件处理程序,如下所示。

private void desempenho_SelectedIndexChanged(object sender, EventArgs e)
    {
        SqlDataAdapter sda = new SqlDataAdapter("select desc from vidros where desempenho ='" + desempenho.Text + "'", con);
        DataTable DTT = new DataTable();
        sda.Fill(DTT);
        checkedListBox1.Items.Clear();
        foreach (DataRow AB in DTT.Rows)
        {
            checkedListBox1.Items.Add(AB["desc"].ToString());
        }
    }

将此处理程序附加到处理程序的 SelectedIndexChanged 事件,它应该可以解决问题。