如何在Windows窗体应用程序中缓存datagridview

时间:2014-04-29 15:45:49

标签: c# sql-server winforms visual-studio-2012 datagridview

我正在开发一个应用程序,其中使用SQL从四个joins表中检索数据,并将检索到的数据填充到Windows窗体上的datagridview。 我有两个Radio Buttons ALLDrawDate,默认情况下ALL选择单选按钮,一旦打开应用程序,它会将所有数据填充到datagridview当我选择DrawDate Radio Button时,只会在datagridview上填充与该抽奖日期相关的数据。在此之前一切正常但在选择DrawDate Radio Button后如果用户希望通过选择ALL Radio Button再次获取所有数据,它会再次加载来自数据库服务器的所有数据,这不是首选。 有没有更好的方法可以在应用程序打开后缓存填充的数据,并在用户稍后需要时选择ALL Radio Button时填充它?

C#代码

sqlcon = GetConnectionString();
            try
            {
                sqlcon.Open();

                //var sw = Stopwatch.StartNew();

                for (int i = 0; i < dgvPaymentsReceived_Collections.RowCount; i++)
                {
                    int trademonth = Convert.ToInt32(dgvPaymentsReceived_Collections.Rows[i].HeaderCell.Value);


                    for (int j = 0; j < dgvPaymentsReceived_Collections.ColumnCount; j++)
                    {
                        int paymentmonth = Convert.ToInt32(dgvPaymentsReceived_Collections.Columns[j].HeaderCell.Value);

                        //var sw = Stopwatch.StartNew();

                        SqlCommand cmd_PaymentsReceived = new SqlCommand();

                        cmd_PaymentsReceived.Connection = sqlcon;
                        cmd_PaymentsReceived.CommandType = CommandType.StoredProcedure;
                        cmd_PaymentsReceived.CommandText = sp_PaymentsReceved_Collections;

                        cmd_PaymentsReceived.Parameters.Add(new SqlParameter("@trademonth", trademonth));
                        cmd_PaymentsReceived.Parameters.Add(new SqlParameter("@paymentmonth", paymentmonth));


                        SqlDataAdapter da_PaymentsReceived_Collections = new SqlDataAdapter();
                        DataTable dt_PaymentsReceived_Colletions = new DataTable();

                        da_PaymentsReceived_Collections.SelectCommand = cmd_PaymentsReceived;
                        da_PaymentsReceived_Collections.Fill(dt_PaymentsReceived_Colletions);

                        //sw.Stop();
                        //MessageBox.Show(sw.ElapsedMilliseconds.ToString());

                        dgvPaymentsReceived_Collections.Rows[i].Cells[j].Value = dt_PaymentsReceived_Colletions.Rows[0][0].ToString();

                    }
                }

                sqlcon.Close();
            }

enter image description here

4 个答案:

答案 0 :(得分:1)

您还没有向我们展示任何代码。你用了什么样的连接?不要将您的数据库源绑定到数据网格视图 - 使用Enumerable / IList集合或DataSet作为您的数据持有者,然后只分配它的一部分(使用它过滤它) LINQ)到您的datagridview。这样你就不必每次都在内存中创建一个新的集合,只需迭代具有给定条件的项目。

答案 1 :(得分:0)

假设您没有大量数据,可以将SQL结果存储在DataTable中,然后将其绑定到DataGridView

答案 2 :(得分:0)

您可以考虑在单击IEnumerable按钮时将SQL数据存储在All数据结构中,并将该集合绑定到gridview,并在DrawDate按钮单击期间对其进行排序适当收集。

答案 3 :(得分:0)

如果您希望能够更改显示的内容,可以挂起原始数据表并创建一个单独的DataTable绑定到DataGridView。

只需填写一次数据表,然后创建一个新的DataTable即可隐藏您不需要的内容。

这可能会使用更多的内存,具体取决于DataTable的大小,但它可能是最容易实现的解决方案。

    DataTable viewedData = dt_PaymentsReceived_Colletions;

    if(hideIncome.Checked) {
        viewedData.Columns.Remove("Income");
        viewedData.AcceptChanges();
    }

    DataGridView1.DataSource = viewedData;