C#Winform程序的dataGridView让某行不参与排序

        最近在做一个需求的时候,需要在dataGridView的最后两行添加一个平均值、总计的行,这两行不能参与排序的。现在的dataGridView其实默认最后一行不参加排序的,但是现在我是最后两行不参与排序,因此需要自己动手解决。类似的,以下解决方案可以让任意一行不参与排序。

        首先建立一个winform程序,放入控件dataGridView,然后建立四个列,这里需要将排序设置为NotSorttable,如图所示:

        这里主要的原理是这样:刚开始加载的时候,先将需要排序的数据加载到dataGridView中,排序主要靠代码实现,不再试直接修改属性实现。因此需要一个一个排序的标志,sortSign,让其true时进行正序排列,false时进行倒序排列。然后加载完排序的数据,再加载不需要进行排序的数据,并进行相关的计算。点击列头,触发DataGridView1_ColumnHeaderMouseClick事件,然后获取到列的序号,根据列的序号对某一列进行排序。代码实现如下:

namespace WinfromSortTest
{
	public partial class Form1 : Form
	{
		//排序标志
		private bool sortSign = true;
		//列序号
		private int columnIndex = 0;

		public Form1()
		{
			InitializeComponent();
		}

		private void Form1_Load(object sender, EventArgs e)
		{
			
			ShowData();
		}
		/// <summary>
		/// 给dataGridView添加初始的数据
		/// </summary>
		private void ShowData()
		{
			this.dataGridView1.RowCount = 5;
			for (int i = 0;i < 4;i++)
			{
				this.dataGridView1.Rows[i].Cells["Column1"].Value = i;
				this.dataGridView1.Rows[i].Cells["Column2"].Value = i+1;
				this.dataGridView1.Rows[i].Cells["Column3"].Value = i+2;
				this.dataGridView1.Rows[i].Cells["Column4"].Value = i+3;
			}
			//排序
			if(sortSign)
			{
				this.dataGridView1.Sort(dataGridView1.Columns[columnIndex], ListSortDirection.Ascending);

			}
			else
			{
				this.dataGridView1.Sort(dataGridView1.Columns[columnIndex], ListSortDirection.Descending);
			}
			//排序完成后进行平均值和合计两行数据的添加,这样,其就不会进行排序了
			SumAndAvg();
		}
		/// <summary>
		/// 点击列标题触发的事件
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		private void DataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
		{
			sortSign = !sortSign;
			columnIndex = int.Parse(e.ColumnIndex.ToString());
			ShowData();
			this.dataGridView1.ClearSelection();
		}

		/// <summary>
		/// 平均值和合计两列数据的添加
		/// </summary>
		private void SumAndAvg()
		{
			this.dataGridView1.RowCount = 6;

			this.dataGridView1.Rows[5].Cells["Column1"].Value = "合计";

			double column2Sum = 0;
			double column3Sum = 0;
			double column4Sum = 0;

			for(int i = 0;i < 4; i++)
			{
				column2Sum += double.Parse(this.dataGridView1.Rows[i].Cells["Column2"].Value.ToString());
				column3Sum += double.Parse(this.dataGridView1.Rows[i].Cells["Column3"].Value.ToString());
				column4Sum += double.Parse(this.dataGridView1.Rows[i].Cells["Column4"].Value.ToString());
			}

			this.dataGridView1.Rows[5].Cells["Column2"].Value = column2Sum;
			this.dataGridView1.Rows[5].Cells["Column3"].Value = column3Sum;
			this.dataGridView1.Rows[5].Cells["Column4"].Value = column4Sum;

			this.dataGridView1.Rows[4].Cells["Column1"].Value = "平均值";

			this.dataGridView1.Rows[4].Cells["Column2"].Value = Math.Round(column2Sum / 4,2,MidpointRounding.AwayFromZero);
			this.dataGridView1.Rows[4].Cells["Column3"].Value = Math.Round(column3Sum / 4, 2, MidpointRounding.AwayFromZero);
			this.dataGridView1.Rows[4].Cells["Column4"].Value = Math.Round(column4Sum / 4, 2, MidpointRounding.AwayFromZero);
		}
	}
}

        以下是运行结果,点击列头进行排序:

       下载资源链接:https://download.csdn.net/download/qq_41061437/12029527

        没有积分的给我留言,留下邮箱,我私发。

发布了165 篇原创文章 · 获赞 41 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq_41061437/article/details/103513257