C#datagridview置顶置底操作

C# datagridview选中行置顶

我采用了网上的几种书写方式,但是因为我是使用的绑定数据库,都出现了各种报错的情况。

 ////主键列ID不可操作
            //int rowIndex = dataGridView1.SelectedRows[0].Index;  //得到当前选中行的索引

            //if (rowIndex == 0)
            //{
            //    MessageBox.Show("已经是第一行了!");
            //    return;
            //}

            //List list = new List();
            //for (int i = 0; i < dataGridView1.Columns.Count; i++)
            //{
            //    list.Add(dataGridView1.SelectedRows[0].Cells[i].Value.ToString());   //把当前选中行的数据存入list数组中
            //}

            //for (int j = 0; j < dataGridView1.Columns.Count; j++)
            //{
            //    dataGridView1.Rows[rowIndex].Cells[j].Value = dataGridView1.Rows[rowIndex - 1].Cells[j].Value;
            //    dataGridView1.Rows[rowIndex - 1].Cells[j].Value = list[j].ToString();
            //}
            //dataGridView1.Rows[rowIndex - 1].Selected = true;
            //dataGridView1.Rows[rowIndex].Selected = false;

  //绑定数据源后无法通过代码添加数据行
        //            //DataGridViewRow dgvr = dataGridView.Rows[index - dgvsrc.Count];//获取选中行的上一行
        //            //dataGridView.Rows.RemoveAt(index - dgvsrc.Count);//删除原选中行的上一行
        //            //dataGridView.Rows.Insert((index), dgvr);//将选中行的上一行插入到选中行的后面
        //            //for (int i = 0; i < dgvsrc.Count; i++)//选中移动后的行
        //            //{
        //            //    dataGridView.Rows[index - i - 1].Selected = true;
        //            //}

列ID为数据库的主键,直接添加报错不允许修改ID。
尝试过了网上的几种置顶置底方法,都会遇到绑定数据源不允许修改的问题。
dt选中行实现置顶置底操作,数据库内容可以不进行变化,仅dt显示效果变化。

具体你贴出你的报错信息。
我个人简单的做法是在sql里面,使用排序算法,增加一个虚拟列,需要置顶的为0,否则为1,先按照这个条件排序,再按照其他条件排序。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7482418
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:关于DataGridView控件的标题列显示序号方法问题,及不显示标题列方法
  • 除此之外, 这篇博客: C# 解决datagridview控件显示大量数据拖拉卡顿问题中的 问题描述: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    由于在使用SQL查询大量的数据并一次显示到dataGridView控件,出现拖拉的时候卡顿。
    解决方法:
    1.首先分页。
    2.其次把显示控件设置双buffer。

    解决过程如下:

    1.设置dataGridView双buffer代码如下,需要引用反射命名空间

     Type dgvType = this.dataGridView1.GetType();
                PropertyInfo pi = dgvType.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic);
                pi.SetValue(this.dataGridView1, true, null);
    

    2.自己定义分页操作控件,上一页,下一页,首页,尾页,在加载form的时候添加事件。并为他们写一个操作事件

      private void Form1_Load(object sender, EventArgs e)
            {
    
                this.btn_EndPage.Click += Ctrl_Click;
                this.btn_FirstPage.Click += Ctrl_Click;
                this.btn_LastPage.Click += Ctrl_Click;
                this.btn_NextPage.Click += Ctrl_Click;
    
    
                //this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.AllPaintingInWmPaint, true);
                //this.UpdateStyles();
               
        
            }
    
            private void Ctrl_Click(object sender, EventArgs e)
            {
                Button btn = (Button)sender;
                if (btn.Text == this.btn_EndPage.Text)
                {
                    if (currentPage == pageCount)
                    { return; }
                    currentPage = pageCount;
                    LoadPage();
                }
                else if (btn.Text == this.btn_FirstPage.Text)
                {
                    if (currentPage == 1)
                    { return; }
                    currentPage = 1;
                    LoadPage();
                }
                else if (btn.Text == this.btn_LastPage.Text)
                {
                    if (currentPage == 1)
                    { return; }
                    currentPage--;
                    LoadPage();
                }
                else if (btn.Text == this.btn_NextPage.Text)
                {
                    if (currentPage == pageCount)
                    { return; }
                    currentPage++;
                    LoadPage();
                }
                else
                {
                    MessageBox.Show("error");
                }
    
    
            }
    

    3.下面代码是分页方法,加载page

      #region datagridview sort
    
            /// <summary>
            /// 每页记录数
            /// </summary>
            private int pageSize = 50;
    
            /// <summary>
            /// 总记录数
            /// </summary>
            private int recordCount = 0;
    
            /// <summary>
            /// 总页数
            /// </summary>
            private int pageCount = 0;
    
            /// <summary>
            /// 当前页
            /// </summary>
            private int currentPage = 0;
    
    
            /// <summary>
            /// 分页的方法
            /// </summary>
            /// <param name="str"></param>
            private void PageSorter()
            {
                foreach (DataColumn col in dt.Columns)
                {
                    DataGridViewTextBoxColumn dgvc = new DataGridViewTextBoxColumn();
                    dgvc.Name = "";
                    dgvc.DataPropertyName = "";
                    dgvc.HeaderText = col.ToString();
                    dataGridView1.Columns.Add(dgvc);
                }
                recordCount = dt.Rows.Count;     //记录总行数
                pageCount = (recordCount / pageSize);
                if ((recordCount % pageSize) > 0)
                {
                    pageCount++;
                }
                //默认第一页
                currentPage = 1;
                LoadPage();//调用加载数据的方法
            }
    
    
            /// <summary>
            /// LoadPage方法
            /// </summary>
            private void LoadPage()
            {
                if (currentPage < 1) currentPage = 1;
                if (currentPage > pageCount) currentPage = pageCount;
    
                int beginRecord;    //开始指针
                int endRecord;      //结束指针
                DataTable dtTemp;
                dtTemp = dt.Clone();
    
                beginRecord = pageSize * (currentPage - 1);
                if (currentPage == 1) beginRecord = 0;
                endRecord = pageSize * currentPage;
    
                if (currentPage == pageCount) endRecord = recordCount;
                for (int i = beginRecord; i < endRecord; i++)
                {
                    dtTemp.ImportRow(dt.Rows[i]);
                }
    
                dataGridView1.Rows.Clear();
                this.lb_CurrentRow.Text = "当前页: " + currentPage.ToString() + " / " + pageCount.ToString();//当前页
                this.lb_TotalRows.Text = "总行数: " + recordCount.ToString() + " 行";//总记录数
                                                                                
    
    
                把临时table的数据插入到datagridview控件里面。
                for (int i = 0; i < dtTemp.Rows.Count; i++)
                {
                    dataGridView1.Rows.Add();
                    for (int j = 0; j < dtTemp.Columns.Count; j++)
                        dataGridView1.Rows[i].Cells[j].Value = dtTemp.Rows[i][j].ToString();
                }
            }
    
            #endregion
    

  • 您还可以看一下 王进老师的跟着王进老师学开发之C#篇第五季:图书管理系统课程中的 获取出版社信息展示在DataGridView中小节, 巩固相关知识点

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^