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