当项目与数据库中的值不相等时如何取回列表的数据源

Posted

技术标签:

【中文标题】当项目与数据库中的值不相等时如何取回列表的数据源【英文标题】:How to get back a datasource for a list when an item is not equal value from database 【发布时间】:2016-03-01 14:26:58 【问题描述】:

我有带按钮的月历,当单击按钮并且月历中的选定日期等于数据库列中的值时,我使用了数据库中的 listbox.datasource,但之后当我在月历和选定日期不等于我想要返回我使用的列表的第一个数据源的列值。 请注意,我只使用: if(date.Equals("20160322")) 没有 foreach 它可以正常工作,但不能使用 foreach 循环遍历列

private void button1_Click(object sender, EventArgs e)
    
        for (int i = 0; i < defaultList.Length; i++)
        
            listBox1.Items.Add(defaultList[i]);
        
        string date = monthCalendar1.SelectionStart.Date.ToString("yyyyMMdd");
        string connetionString = null;
        mysqlConnection connection;
        MySqlCommand command;
        MySqlDataAdapter adapter = new MySqlDataAdapter();
        DataSet ds = new DataSet();
        int i = 0;
        string sql = null;
        connetionString = "datasource=localhost; database=bokning;port=3306;username=root;password=666666";
        sql = "select date,dayTime from newsystem where date='" + date + "'";
        connection = new MySqlConnection(connetionString);
        try
        
            connection.Open();
            command = new MySqlCommand(sql, connection);
            adapter.SelectCommand = command;
            adapter.Fill(ds);
            adapter.Dispose();
            command.Dispose();
            connection.Close();

            dtDatetime = ds.Tables[0];
            foreach (DataRow dr in dtDatetime.Rows)
            

                if (date.Equals(dr["date"]))
                

                    listBox1.DataSource = ds.Tables[0];
                    listBox1.ValueMember = "date";
                    listBox1.DisplayMember = "dayTime";
                
                else
                
                    //listBox1.Items.Clear();
                    listBox1.DataSource = defaultList;
                                                                          
          

        
        catch (Exception ex)
        
            MessageBox.Show("Cannot open connection ! ");
        
    

【问题讨论】:

单步执行循环能给您带来什么?它对 date 和 dr["date"] 显示什么 Console.WriteLine(dr["date"]); foreach 内部给了我 20160322 ,这与月历(日期)中的选定日期相同。它更改了数据源,但是在选择了与 dr[date] 不匹配的新日期后,旧数据源没有回来,列中的新日期仍然在列表框中 我必须承认,粗略的一瞥告诉我,所有行都应该匹配——因为这就是你的 SQL 代码所要求的......因为你有一个 foreach,如果你有 4 个项目而第三个不匹配, listbox1 将是来自 sql 的数据源 - 如果没有匹配项......你不会进入 foreach - 因为没有行,所以我猜 datasource=defaultlist 永远不会达到,因为它总是匹配 datasource=defaultlist 如果我只是喜欢它; if (date.Equals("20160322")) listBox1.DataSource = ds.Tables[0]; listBox1.ValueMember = "日期"; listBox1.DisplayMember = "dayTime"; else listBox1.DataSource = defaultList; 完全正确 - 当前 if 位于您检索到的项目的 for 循环中,如果没有项目,则它无法执行 else。 【参考方案1】:

您的代码:

foreach (DataRow dr in dtDatetime.Rows) if (date.Equals(dr["date"])) listBox1.DataSource = ds.Tables[0]; listBox1.ValueMember = "date"; listBox1.DisplayMember = "dayTime"; else listBox1.DataSource = defaultList;

如果没有项目,则无法到达 else 语句 - 如果匹配,所有项目都将匹配日期。此代码是您的逻辑错误所在

你需要类似的东西

伪代码:如果 rows.count>0 将数据源设置为 ds.tables[0] else datasource=defaultlist

没有for循环 如果有 100 个项目,没有必要设置 100 次

【讨论】:

mm 我明白了,我明天上班试试这个,你是这样的; if dtDatetime.Rows.count >0 set datasource to ds.tables[0] else datasource=defaultlist without any loop? 是的,因为如果有行,您只需要知道有一些行,您就不需要将其多次设置为同一事物.. 只需一次。

以上是关于当项目与数据库中的值不相等时如何取回列表的数据源的主要内容,如果未能解决你的问题,请参考以下文章

在EXCEL中,两个单元格的值不相等时,单元格的颜色变为红色,要如何设置.

从 JList 取回数据

LeetCode82 删除排序链表中的重复元素

LeetCode82 删除排序链表中的重复元素

LeetCode82 删除排序链表中的重复元素

当返回的列表长度与数据框列数相同时,应用 + 列表推导会给出 ValueError