如何从选中的清单框中检索数据并在datagrideview中显示数据?

已加入
2020年8月28日
留言内容
1
编程经验
5-10
我使用这些代码从选中的清单列表中检索数据,并在datagrideview中显示数据

问题查询检索数据选中一个选中的列表框而不选择多个选中的列表框我要在选中多个选中的列表框的datagrideview中检索数据

C#:
string s = "";
int x;
for (x = 0; x <= checkedListBox1.CheckedItems.Count - 1; x++)
{

    s = "'" + checkedListBox1.CheckedItems[x].ToString() + "',";

}
s = s.Substring(0, s.Length - 1);




con = new SqlConnection(cs.DBConn);
con.Open();


cmd = new SqlCommand("select id,'',raqam,name_sender,country1,country2,tel1,tel2,title,detalis,n_number,price,ship,total,name from pos where country2 IN("+s+") order by id asc ", con);

rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

bunifuCustomDataGrid1.Rows.Clear();
while (rdr.Read() == true)
{


    bunifuCustomDataGrid1.Rows.Add(rdr[0], rdr[1], rdr[2], rdr[3], rdr[4], rdr[5], rdr[6], rdr[7], rdr[8], rdr[9], rdr[10], rdr[11], rdr[12], rdr[13], rdr[14]);
    bunifuCustomDataGrid1.Rows.OfType<DataGridViewRow>().Last().Selected = true;
    bunifuCustomDataGrid1.CurrentCell = bunifuCustomDataGrid1.Rows[bunifuCustomDataGrid1.Rows.Count - 1].Cells[1];

}
con.Close();

Mod Edit,请不要粗体显示文字,这很麻烦。
 
由主持人最后编辑:

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
欢迎来到论坛。

首先,学习使用参数化查询,不要将命令查询字符串连接在一起。

您可以在我的签名中找到指向 使用参数化查询.

我还建议您通过删除大量代码并使其内联代码来缩短代码使用量。

在连接,命令和阅读器上使用using块也将是一个重要的改变;这样做还将关闭并处置这些对象使用的资源。

我也更喜欢先检查reader.HasRows是否,然后再继续阅读。将您的代码包装在try catch块中以捕获可能发生的任何错误也没有什么坏处。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,514
地点
弗吉尼亚州切萨皮克
编程经验
10+
I would also recommend learning how to bind to the DataSource property instead of adding the rows to the [il]DataGridView[/il] programmatically.

标记选定的行/单元格应该真正在循环之外完成。实际上,如果使用数据绑定,您甚至都不会有循环(用于添加行)。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,512
地点
悉尼,澳大利亚
编程经验
10+
我通常不这样做,但是其他人已经解释了大多数要求,并且很久以前我已将大部分代码发布到其他地方,因此我很乐意在没有太多解释的情况下发布代码。您需要稍微更改一些名称,但是此代码演示了构建动态过滤器的原理:
C#:
using (var connection = new SqlConnection("connection string here"))
using (var command = new SqlCommand { Connection = connection })
using (var adapter = new SqlDataAdapter(command))
{
    var query = new StringBuilder("SELECT * FROM MyTable");

    switch (checkedListBox1.CheckedItems.Count)
    {
        case 0:
            // No filter criteria.
            break;
        case 1:
            // A single filter criterion.
            query.Append(" WHERE MyColumn = @MyColumn");
            command.Parameters.AddWithValue("@MyColumn", checkedListBox1.CheckedItems[0]);

            break;
        default:
            // Multiple filter criteria.
            query.Append(" WHERE MyColumn IN (");

            for (var i = 0; i < checkedListBox1.CheckedItems.Count; i++)
            {
                var paramName = "@MyColumn" + i;

                if (i > 0)
                {
                    query.Append(", ");
                }

                query.Append(paramName);
                command.Parameters.AddWithValue(paramName, checkedListBox1.CheckedItems[i]);
            }

            query.Append(")");

            break;
    }

    command.CommandText = query.ToString();

    var table = new DataTable();

    // Retrieve the data.
    adapter.Fill(table);

    // Bind the data to the grid.
    bindingSource1.DataSource = table;
    dataGridView1.DataSource = bindingSource1;
}
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,512
地点
悉尼,澳大利亚
编程经验
10+
我也更喜欢先检查reader.HasRows是否,然后再继续阅读。
就个人而言,考虑到 将返回与相同的值 HasRows ,我只测试 HasRows 在两种特定情况下:
  1. 我只关心是否有数据,而不关心数据是什么。
  2. 如果没有数据,我想做一些特定的事情。
For instance, if I was going to read the data to populate a grid, I would generally just use while (myDataReader.Read()). If I wanted to provide a specific notification when there was no data though, then I would use this:
C#:
 如果  (myDataReader.HasRows)
{
    while (myDataReader.Read())
    {
        // ...
    }
}
else
{
    // Notify user of no data.
}
这使得代码更整洁。那就是 在内部做的工作比 HasRows ,因此效率较低。但是,在大多数情况下,差异是可以忽略的,在这种情况下,我倾向于将可读性/可维护性放在性能之上。不过,可读性差异也很小,因此我不会谴责使用该软件的人 HasRows 太苛刻了  ;)
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
你提出好点子。但是,我个人更喜欢调用HasRows,因为它在后台进行的工作比实际致力于读取自身的工作少。实际上您的代码示例就是为什么我说:
我也更喜欢先检查reader.HasRows是否,然后再继续阅读。
我暗示要这样做。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
我从未真正地盲目阅读过,而没有真正检查过HasRows。正如您所展示的,这是我一直写我的阅读块的一种方式。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,512
地点
悉尼,澳大利亚
编程经验
10+
我从未真正地盲目阅读过,而没有真正检查过HasRows。正如您所展示的,这是我一直写我的阅读块的一种方式。
我想这个问题是“为什么"虽然。如果有 其他 然后按照我的建议,我也会那样做。如果没有,为什么要 HasRows 什么时候 会产生相同的结果吗?您正在保存的工作 如果没有数据,那么可以,但是需要毫秒。我们是否总是尝试以这种方式节省毫秒,即使这意味着更复杂的代码也是如此?对我来说,答案是"no"。除非性能差异显着,否则我将使用可读性最高的代码。也就是说,多一个 如果 也不是代码复杂度的大幅增加,因此我当然不会考虑暗示您的方法是错误的。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
one extra 如果 也不是代码复杂度的大幅增加
确实不是。
If there is an 其他 然后按照我的建议,我也会那样做。
也许您不关注我如何编写很多条件逻辑。但是我认为自己有时对条件逻辑过于热衷,因为这就是我编写语句的方式。而且,在处理条件逻辑时,我通常会选择涵盖所有可能发生的事情。因此,除非我没有返回没有找到数据的条件。我可能会读。但是我;十分之九,永远不要这样做,因为在HasRows上没有别的条件对我来说是没有意义的。  :不确定:
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,926
地点
英国
编程经验
10+
当我感到厌恶时,请不要接受第一句话。我的意思是;如果您看过我何时写条件逻辑,我通常会谨慎对待所有可能发生的事情,并且我会经常尝试涵盖所有相关或不相关的可能性。有些人喜欢这样写。我认为自己就是这些人之一。  :)

没有替代条件,我永远不会使用HasRows。
 
Last edited:
最佳 底部