使用BindingSource在DataGridView上自定义排序

时间:2015-03-26 09:25:02

标签: c# winforms sorting datagridview

我试图提高在DataGridView中加载相对大量数据的性能,我发现将DGV数据源设置为完全呈现之间的时间非常长。我把它分离到我的DataBindingComplete事件中的列格式的动态设置,它(在逐步查找之后)而不是在每个列的基础上应用格式,以某种方式在每个单元格的基础上(!!)。当细胞数量巨大时,这显然会使渲染陷入困境。

我开始修改内存中的数据,通过value.ToString("N")将DataTable值从双精度值更改为格式化字符串。这显着加快了渲染速度,但是我留下了几列字符串而不是双打,这破坏了网格的自然分类能力。我已经搜索了很多,如果可以在DataGridView级别,BindingSource级别或DataTable级别上进行自定义排序,则无济于事。

感谢是否有人可以指出我正确的方向,特别是如果这种方法完全是一个坏主意,并且有更好的方法来实现数字格式化这样的简单任务。

2 个答案:

答案 0 :(得分:1)

我认为this article正是您要找的?您可以通过实现IComparer<T>接口并使用自定义Compare方法,使用LINQ自定义您的BindingSource(我猜您正在使用LINQ吗?)。

答案 1 :(得分:1)

对于列格式,如果需要格式化,可以这样做,例子是dateTime值:

dataGridView1.Columns["Column"].DefaultCellStyle.Format = "MM-dd-yyyy";

对于自定义排序,如果你从sql服务器获取数据,你可以让它在查询中对它返回的行进行排序,它会在dataGridView中的那个orde中显示它们,这是我用于此目的的代码:

string command = "SELECT * FROM [table] ORDER BY [column]";
//database connection string
string constring =[database connection string];
//open DB connection - execute query - create dataadapter - fill datatable - bind datasource to datatable
using (SqlConnection con = new SqlConnection(constring))
    {
    using (SqlCommand cmd = new SqlCommand(command, con))
        {
        cmd.CommandType = CommandType.Text;
        using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
            {
            using (DataTable dt = new DataTable())
                {
                try
                  {
                  //fill the dataGridView
                  sda.Fill(dt);
                  dataGridView1.DataSource = dt;
                  Console.WriteLine("Refreshing Complete");
                  //disable manual sorting on all columns
                  for (int i = 0; i < dataGridView1.Columns.Count; i++)
                  {
                    dataGridView1.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
                  }
                  //Autosize all cells
                  dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
                  dataGridView1.AutoResizeColumns();
                  }
                  catch (Exception e)
                  {
                  MessageBox.Show(e.Message);
                  }
              }
          }
       }
  }

这将按返回行的顺序将查询输出绑定到dataGridView,将行的手动排序设置为false并自动调整所有列。 如果您想重新填充dataGridView,可以使用:

dataGridView1.DataSource = null;
dataGridView1.Refresh();

然后再次运行填充。 如果需要,您还可以在绑定查询输出期间更改列的显示顺序和列标题名称。 我希望这有点帮助