0

我正在尝试执行以下操作:

我有一个函数..它查询 SQL 并从数据库中获取一些数据..现在我想在表单上的列表视图中显示这些值。该函数位于 SQL 类中。

它仅适用于一个项目,但如果我想通过例如 5 个项目,它不会工作,因为它只通过最后一次,当你看到代码时这是合乎逻辑的。

我似乎无法弄清楚,如何将 listvie 对象从表单“引用”到函数并将项目传递给它。

这是代码:(我知道它现在只返回一个项目,我尝试了不同的东西..没有工作):

    public ListViewItem SQL_GetLogsHistory(string WKS)
    {
        SqlCommand mySQLCommand = new SqlCommand(Properties.Settings.Default.SQL_GetLogsHistroy, SQLconn);
        mySQLCommand.Parameters.AddWithValue("@WKS", WKS);
        SqlDataReader reader = mySQLCommand.ExecuteReader();
        ListViewItem item = new ListViewItem();


        while (reader.Read())
        {
            item = new ListViewItem(new[] { 

                reader.GetValue(4).ToString(), // Timestamp
                reader.GetValue(2).ToString() // Log

            });

        }

        reader.Close();
        return item;
    }
4

3 回答 3

3

你可以有物品清单

List<ListViewItem> items = new List<ListViewItem>();

在您的循环中创建新ListViewItem的并设置属性并将其添加到列表中

    while (reader.Read())
    {
        ListViewItem item = new ListViewItem();
        item = new ListViewItem(new[] { 

            reader.GetValue(4).ToString(), // Timestamp
            reader.GetValue(2).ToString() // Log

        });
      items.Add(item);

    }

最后items从方法返回并更改方法的签名,如下所示

public List<ListViewItem> SQL_GetLogsHistory(string WKS)

旁注:最好使用usingforSqlCommandSqlDataReader

public List<ListViewItem> SQL_GetLogsHistory(string WKS)
{
    List<ListViewItem> items = new List<ListViewItem>();
    using (SqlCommand mySQLCommand = new SqlCommand(Properties.Settings.Default.SQL_GetLogsHistroy, SQLconn))
    {
        mySQLCommand.Parameters.AddWithValue("@WKS", WKS);
        using (SqlDataReader reader = mySQLCommand.ExecuteReader())
        {
            while (reader.Read())
            {
                ListViewItem item =  new ListViewItem(new[] { 
                            reader.GetValue(4).ToString(), // Timestamp
                            reader.GetValue(2).ToString() // Log
                        });
                items.Add(item);
            }
        }

    }
    return items;
}
于 2013-06-14T08:03:24.277 回答
3

您可以使用产量回报:

   public IEnumerable<ListViewItem> SQL_GetLogsHistory(string WKS)
    {
        SqlCommand mySQLCommand = new SqlCommand(Properties.Settings.Default.SQL_GetLogsHistroy, SQLconn);
        mySQLCommand.Parameters.AddWithValue("@WKS", WKS);
        SqlDataReader reader = mySQLCommand.ExecuteReader();
        ListViewItem item = new ListViewItem();


        while (reader.Read())
        {
            yield return new ListViewItem(new[] { 

                reader.GetValue(4).ToString(), // Timestamp
                reader.GetValue(2).ToString() // Log

            });

        }

        reader.Close();
        return item;
    }

这将减少数据的多次枚举。然后,如果需要,您可以使用此方法创建一个List<ListViewItem>

var list = SQL_GetLogsHistory(WKS).ToList();

或者您可以直接将其用作列表视图数据源:

listView.DataSource = SQL_GetLogsHistory(WKS);
于 2013-06-14T08:03:41.623 回答
1

你只需要这样返回List<ListViewItem>吗?

public List<ListViewItem> SQL_GetLogsHistory(string WKS)
{
    SqlCommand mySQLCommand = new SqlCommand(Properties.Settings.Default.SQL_GetLogsHistroy, SQLconn);
    mySQLCommand.Parameters.AddWithValue("@WKS", WKS);
    SqlDataReader reader = mySQLCommand.ExecuteReader();
    List<ListViewItem> items = new List<ListViewItem>();

    while (reader.Read())
    {
        var item = new ListViewItem(new[] { 

            reader.GetValue(4).ToString(), // Timestamp
            reader.GetValue(2).ToString() // Log

        });

        items.Add(item);
    }

    reader.Close();
    return items;
}
于 2013-06-14T08:03:59.303 回答