【问题标题】:How to cache a datagridview in windows forms application如何在 Windows 窗体应用程序中缓存 datagridview
【发布时间】:2014-04-29 15:45:48
【问题描述】:

我正在开发一个应用程序,其中使用joins 从四个SQL 表中检索数据,并将检索到的数据填充到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();
            }

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 请注意,您还可以使用 asp.net 中的缓存对象进行缓存:System.Web.Caching。但是除非你需要所有的功能,否则它可能是矫枉过正的。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        只需填写一次数据表,然后创建一个新的 DataTable 来隐藏不需要的数据。

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

            DataTable viewedData = dt_PaymentsReceived_Colletions;
        
            if(hideIncome.Checked) {
                viewedData.Columns.Remove("Income");
                viewedData.AcceptChanges();
            }
        
            DataGridView1.DataSource = viewedData;
        

        【讨论】:

          猜你喜欢
          • 2011-03-31
          • 1970-01-01
          • 2021-07-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多