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

我正在开发一个应用程序,其中使用joins 从四个SQL 表中检索数据,并将检索到的数据填充到Windows 窗体上的datagridview 中。 我有两个 Radio Buttons ALL 和 DrawDate ,默认情况下 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
          相关资源
          最近更新 更多