将新行添加到已排序的datagridview c#

时间:2016-03-13 10:57:46

标签: c# winforms sorting datagridview datatable

我试图在我的datagridview中添加一个新行

DataRow dr = new dt.NewRow();
dt.Rows.InsertAt(dr,5);

上面几行我有这行代码

Datagridview1.Sort(datagridview1.Columns[6],ListSortDirection.Ascending);

问题是我的datagridview在添加新行后再次排序。我的行出现在第5行的第1行instmi

我该怎么做才能解决它?

  

好的,我会向你解释我的最终目标。我有一个datagridview   像我说的那样排序。我想添加一个夏季行,我需要它   在datagridview的末尾。我该怎么办?

1 个答案:

答案 0 :(得分:2)

这是它应该的方式。您告诉网格基于该列对行进行排序。因此,如果要基于任何其他首选项显示行,请将其告知网格。

  • 如果您需要仅在首次加载时对行进行排序,只需从数据存储中加载它们,然后不要为网格设置任何排序。这样,您可以在末尾插入摘要行。
  • 如果您想让用户在排队时对网格进行排序,您可以自己处理网格排序。

示例

我个人更喜欢创建一份报告来满足这样的要求。此外,摘要可以显示在网格下的某些文本框中。

但是对于您确实需要执行此类任务的情况,这里有一个示例,向您展示如何让用户对网格进行排序,同时您有一个摘要行。它在不更改摘要行位置的情况下对网格进行排序。

这是表单加载事件。我们加载数据,设置网格的数据源,并将列排序模式设置为Programmatic

DataTable originalData;
private void Form1_Load(object sender, EventArgs e)
{
    GetData();
    SetDataSource();

    //Set all columns sort mode to Programmatic
    this.dataGridView1.Columns.Cast<DataGridViewColumn>().ToList()
        .ForEach(c => { c.SortMode = DataGridViewColumnSortMode.Programmatic; });

    this.dataGridView1.ColumnHeaderMouseClick += dataGridView1_ColumnHeaderMouseClick;
}

处理列标题的点击事件并对数据进行排序。阅读代码评论:

void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
    var grid = (DataGridView)sender;

    //Removes sort glyph 
    this.dataGridView1.Columns.Cast<DataGridViewColumn>()
        .Except(new[] { grid.Columns[e.ColumnIndex] }).ToList()
        .ForEach(c => { c.HeaderCell.SortGlyphDirection = SortOrder.None; });

    //Sort descending if currently sorted ascending
    if (grid.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection == SortOrder.Ascending)
    {
        originalData.DefaultView.Sort = 
            string.Format("{0} DESC", grid.Columns[e.ColumnIndex].DataPropertyName);
        SetDataSource();
        grid.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = SortOrder.Descending;
    }
    //Sort ascending if currently sorted ascending or not sorted
    else
    {
        originalData.DefaultView.Sort = 
            string.Format("{0} ASC", grid.Columns[e.ColumnIndex].DataPropertyName);
        SetDataSource();
        grid.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = SortOrder.Ascending;
    }
}

以下是设置网格数据源的方法。在这里,您应该将摘要列添加到原始数据表的副本中:

void SetDataSource()
{
    //Copies rows of oroginal data table to a new one based on ordering
    //Then adds a summary row
    //Sets the result as DataSource of grid
    var copy = originalData.DefaultView.ToTable();
    copy.Rows.Add("", originalData.AsEnumerable().Sum(x => x.Field<int>("Value")));
    this.dataGridView1.DataSource = copy;
}

以下是加载数据的方法。您从数据库加载数据,我只是添加一些数据进行测试:

void GetData()
{
    //You load data from database and this data is just for test
    originalData = new DataTable();
    originalData.Columns.Add("Name", typeof(string));
    originalData.Columns.Add("Value", typeof(int));
    originalData.Rows.Add("a", 10);
    originalData.Rows.Add("b", 30);
    originalData.Rows.Add("c", 20);
}