程序化DataGridView排序 [英] Programmatic DataGridView Sort

查看:65
本文介绍了程序化DataGridView排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用一个使用dataGridView的C#winForm项目。我创建了一个customRowDivider,我用它来将dataGridView分成几类。例如,具有1列和10行的网格可以将前6行列为车辆,将后2行列为所有者,将后2行列为经销商。我在每个类别之间插入一个customRowDivider。我想要做的是实现我自己的自定义排序,它将根据每个类别排序,而不是根据整个网格排序。有人可以指点我如何解决这个问题吗?



I''m working on a C# winForm project that uses a dataGridView. I''ve created a "customRowDivider" that I''m using to separate my dataGridView into categories. For example a grid with 1 column and 10 rows may list the first 6 rows as vehicles, the next 2 rows as owners and the last 2 rows as dealerships. I insert a "customRowDivider" between each category. What I''d like to do is implement my own custom sort that will sort according to "each" category and not according to the entire grid. Can someone please point me in the right direction on how to go about this?

public class Form1 : Form
{
   Dictionary<int, CustomRowDivider > rowDivs;
   RowDivider rowDiv;
   DataGridViewRow row;

   public Form1()
   {
       grid.Columns.Add("colName", "Name");
       grid.Columns["colName"].SortMode = DataGridViewColumnSortMode.Programmatic;
       grid.ColumnHeaderMouseClick += grid_ColumnHeaderMouseClick;

       row = new DataGridViewRow();
       DataGridViewTextBoxCell cell1 = new DataGridViewTextBoxCell();
       cell1.Value = "ScrewDriver";
       row.Cells.Add(cell1);
       grid.Rows.Add(row);

       row = new DataGridViewRow();
       DataGridViewTextBoxCell cell2 = new DataGridViewTextBoxCell();
       cell2.Value = "Nails";
       row.Cells.Add(cell2);
       grid.Rows.Add(row);

       row = new DataGridViewRow();
       DataGridViewTextBoxCell cell3 = new DataGridViewTextBoxCell();
       cell3.Value = "Wood";
       row.Cells.Add(cell3);
       grid.Rows.Add(row);
       
       rowDiv = new RowDiv(3);
       rowDivs.Add(0, rowDiv);
       grid.Rows.Add(rowDiv);

       row = new DataGridViewRow();
       DataGridViewTextBoxCell cell4 = new DataGridViewTextBoxCell();
       cell4.Value = "Buick";
       row.Cells.Add(cell4);
       grid.Rows.Add(row);

       row = new DataGridViewRow();
       DataGridViewTextBoxCell cell5 = new DataGridViewTextBoxCell();
       cell5.Value = "Ford";
       row.Cells.Add(cell5);
       grid.Rows.Add(row);

       // etc...
   }

    // this is where i''d like to sort at...
    private void grid_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
    {
         for (int i = 0; i > grid.Rows.Count; i++)
         {
               // stop and sort once I reach a rowDivider
               if(grid.Rows[i] is CustomRowDivider)
               {
               }
               else
               {
               }
         }
     }
}
 
public class CustomRowDivider : DataGridViewRow
{
  public int Idx;
  
  public CustomRowDivider() {}

  public CustomRowDivider(int idx)
         :base()
  {
       Idx = idx;
       base.Height = 3;
       base.DefaultCellStyle.BackColor = Color.LightGray;
  }
}

推荐答案

一种可能的解决方案是按类别对数据集合进行分组并对项目进行排序。之后你用dataGridview填充结果。



如果你在阅读代码时遇到问题,我会为你做的更小。







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;

            // Key => Category which describe every block
            // Value => Speaks for itself
            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"));
            
            // Group the items by category
            var groupedByCategoryAndSorted = data.GroupBy(x => x.Key);

            
            foreach (var category in groupedByCategoryAndSorted)
            {
                // add the category to datagrid as RowDivider item
                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);
                }

                // enumerate the sorted list
                for (int i = 0; i < sortedItems.Count(); i++)
                {
                    var currentItem = sortedItems.ElementAt(i);

                    // Add the items to datagrid
                    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
    }







结果datagridview将是:

RowDivider

a

b

c

d

RowDivider

d

c

b

a




Result in datagridview will be:
RowDivider
a
b
c
d
RowDivider
d
c
b
a


这篇关于程序化DataGridView排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆