我试图在我的datagridview中添加一个新行
DataRow dr = new dt.NewRow();
dt.Rows.InsertAt(dr,5);
上面几行我有这行代码
Datagridview1.Sort(datagridview1.Columns[6],ListSortDirection.Ascending);
问题是我的datagridview在添加新行后再次排序。我的行出现在第5行的第1行instmi
我该怎么做才能解决它?
好的,我会向你解释我的最终目标。我有一个datagridview 像我说的那样排序。我想添加一个夏季行,我需要它 在datagridview的末尾。我该怎么办?
答案 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);
}