我有一个从TSql视图加载DataGridView的进程。我的用户之间一直在争论是否要返回所有行或一定数量(后一阵营中的im:TOP 100)。我决定最好的方法是根据用户设置的字段动态返回行数。我期待这是一个相当微不足道的任务。我期望加载带有while循环和读取函数的数据表,并停在一定数量的行。这可能吗?保存下面的代码是否有很大的好处,但是将数据表(dt)减少到所需的行数,然后从那里加载datagridview?
public void Load_DGV(DataGridView dgv, string sqlx)
{
DateTime d1 = DateTime.Now;
SqlCommand command = new SqlCommand(sqlx.ToString());
SqlConnection connection = new SqlConnection(Properties.Settings.Default._CONNSTRING);
command.Connection = connection;
bool Success = true;
DataTable dt = new DataTable();
connection.Open();
SqlDataReader reader = command.ExecuteReader();
dt.Load(command.ExecuteReader());
connection.Close();
dgv.DataSource = null;
dgv.DataSource = dt;
Color_DGV(dgvProposal);
dgvProposal.Sort(dgvProposal.Columns[m_Current_Menu_Item.OrderByCol], ListSortDirection.Descending);
DateTime d2 = DateTime.Now;
Console.WriteLine("Execution of " + sqlx + " took " + (d2 - d1).Seconds.ToString() + "s. ");
}
答案 0 :(得分:1)
如果你改变了,你将获得更好的性能,这样你就可以传递一个参数来指示要返回的TOP
行的数量。
否则,一旦将所有记录加载到新的DataTable
,就可以使用LINQ到TAKE
第一行xx行,并将其分配给DataSource
。
dataGridView1.DataSource = dt.Rows.Cast<DataRow>().Take(100).CopyToDataTable();
如果您使用reader.Read()
来迭代前100条记录,并手动填充DataTable
,则可以节省一些处理时间。至少那时你没有填充DataTable
有数千条记录只是为了丢弃它并创建另一个,更小DataTable
。