【问题标题】:c# fill checkelistbox from combobox SQL时间:2019-05-01 标签:c#fill checkelistbox from combobox SQL
【发布时间】:2017-02-09 13:34:48
【问题描述】:

我有一个 c# 中的 winform 应用程序,女巫从 SQL 服务器数据库中获取值。 我可以在combobox 中获得我想要出现的值,但根据所做的选择,我想在checkedcombobox 中显示相应的sql 行,以便用户选择所需的行。 我的代码是:(填充组合框)

    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());
    }

并且:(在选中的组合框中显示选定的行)女巫不工作。

 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());
            }
        }

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

提前致谢。

【问题讨论】:

  • 什么不起作用?你能解释一下这段代码有什么问题吗?
  • @Steve 抱歉解释不好。我遇到的问题是,当我从组合框中选择一个项目时,checkedlistbox 中没有出现任何内容。
  • 你确定没有抛出异常吗?该 DESC 字段名称是保留关键字,按原样使用应该会触发异常。
  • 我建议使用调试器检查事件处理程序是否真的被调用以及事件代码处的组合框文本的值是什么。
  • 为什么你的代码在列表框的 selectedindexchanged 事件中?它应该在组合框的 selectedindexchanged 中

标签: c# sql combobox checkedlistbox


【解决方案1】:

看起来绑定列表框的代码放错了地方。 如果要根据组合框的选中项绑定列表框,则需要在组合框的 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 事件,它应该可以解决问题。

【讨论】:

    【解决方案2】:

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

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

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

    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;
     .....
    

    【讨论】:

    • 嗨,感谢您的帮助,不幸的是,checkedlistbox 仍然没有显示任何结果。
    猜你喜欢
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    相关资源
    最近更新 更多