A possible solution is that you group your data collection by category and sort the items. After that you fill the datagridview with the result.
If you have problems with reading the code I will do it smaller for you.
public partial class Form1 : Form
{
List<KeyValuePair<KeyValuePair<string, SortDirection>, string>> data = new List<KeyValuePair<KeyValuePair<string, SortDirection>, string>>();
public Form1()
{
InitializeComponent();
this.Load += Form1_Load;
}
void Form1_Load(object sender, EventArgs e)
{
this.dataGridView1.Columns.Add("colName", "Name");
this.dataGridView1.Columns["colName"].SortMode = DataGridViewColumnSortMode.Programmatic;
KeyValuePair<string, SortDirection> cat1 = new KeyValuePair<string,SortDirection>("Block 1", SortDirection.ASC);
KeyValuePair<string, SortDirection> cat2 = new KeyValuePair<string,SortDirection>("Block 2", SortDirection.DESC);
data.Add(new KeyValuePair<KeyValuePair<string, SortDirection>, string>(cat1, "c"));
data.Add(new KeyValuePair<KeyValuePair<string, SortDirection>, string>(cat1, "a"));
data.Add(new KeyValuePair<KeyValuePair<string, SortDirection>, string>(cat1, "d"));
data.Add(new KeyValuePair<KeyValuePair<string, SortDirection>, string>(cat1, "b"));
data.Add(new KeyValuePair<KeyValuePair<string, SortDirection>, string>(cat2, "c"));
data.Add(new KeyValuePair<KeyValuePair<string, SortDirection>, string>(cat2, "a"));
data.Add(new KeyValuePair<KeyValuePair<string, SortDirection>, string>(cat2, "d"));
data.Add(new KeyValuePair<KeyValuePair<string, SortDirection>, string>(cat2, "b"));
var groupedByCategoryAndSorted = data.GroupBy(x => x.Key);
foreach (var category in groupedByCategoryAndSorted)
{
CustomRowDivider rowDiv = new CustomRowDivider(category.Key.Value);
this.dataGridView1.Rows.Add(rowDiv);
IOrderedEnumerable<KeyValuePair<KeyValuePair<string, SortDirection>, string>> sortedItems;
if (rowDiv.SortDirection == SortDirection.ASC)
{
sortedItems = category.OrderBy(x => x.Value);
}
else
{
sortedItems = category.OrderByDescending(x => x.Value);
}
for (int i = 0; i < sortedItems.Count(); i++)
{
var currentItem = sortedItems.ElementAt(i);
var row = new DataGridViewRow();
DataGridViewTextBoxCell cell1 = new DataGridViewTextBoxCell();
cell1.Value = currentItem.Value;
row.Cells.Add(cell1);
this.dataGridView1.Rows.Add(row);
}
}
}
}
public class CustomRowDivider : DataGridViewRow
{
public int Idx;
public CustomRowDivider() { }
public CustomRowDivider(SortDirection direction)
: base()
{
this.SortDirection = direction;
base.Height = 10;
base.DefaultCellStyle.BackColor = Color.LightGray;
}
public SortDirection SortDirection { get; private set; }
}
public enum SortDirection
{
ASC,
DESC
}
Result in datagridview will be:
RowDivider
a
b
c
d
RowDivider
d
c
b
a