C# DataGridView表格增删改及效率提升,添加CheckBox组件,全选反选

呕心沥血原创,转载请注明出处!

目录

1.设置 DataGridView表格行首为序号索引,

2.设置 DataGridView第一列值为CheckBox类型,

3. DataGridView表格列绑定对象属性

4. DataGridView绑定List集合,首先初始化BindingList数据,如果你的集合是List,必须要将List转成BindingList,界面才能根据你集合的变化而变化

5. DataGridView添加行代码示例:

6. DataGridView删除第一行代码示例:

7. DataGridView删除多行

8. DataGridView删除选中的CheckBox行,

9.DataGridViewCheckBoxColumn点击列名全选/取消全选


以这个界面为例,我们要为这个dataGridView1添加绑定集合中的数据,并且界面要根据集合数据的变化而变化


1.设置 DataGridView表格行首为序号索引,

代码示例:

private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) {
    Rectangle rectangle = new Rectangle(e.RowBounds.Location.X, e.RowBounds.Location.Y, dataGridView1.RowHeadersWidth - 4, e.RowBounds.Height);
    TextRenderer.DrawText(e.Graphics, (e.RowIndex + 1).ToString(), dataGridView1.RowHeadersDefaultCellStyle.Font, rectangle,
    dataGridView1.RowHeadersDefaultCellStyle.ForeColor, TextFormatFlags.VerticalCenter | TextFormatFlags.Right);
}

2.设置 DataGridView第一列值为CheckBox类型,

我看很多人都写了一堆代码来设置单元格为CheckBox,其实没必要,微软有提供现成的给我们用:


3. DataGridView表格列绑定对象属性

参数对象Student

class Student {
    private bool isChceked;
    private string name;
    private string age;
    private string gender;

    public Student(bool isChceked, string name, string age, string gender) {
        this.IsChceked = isChceked;
        this.Name = name;
        this.Age = age;
        this.Gender = gender;
    }

    public bool IsChceked { get => isChceked; set => isChceked = value; }
    public string Name { get => name; set => name = value; }
    public string Age { get => age; set => age = value; }
    public string Gender { get => gender; set => gender = value; }
}

 


4. DataGridView绑定List集合,首先初始化ListBindingList数据,如果你的集合是List,必须要将List转成BindingList,界面才能根据你集合的变化而变化

(1)在类中声明List和BindingList

注意的点:这里其实也可以直接用BindingList来作为数据源,摒弃List,但是当你数据量比较大的时候(百万级),就能明显感受到效率差距是有多明显,所以这里还是老老实实先生成List,在装进BindingList中.

private List<Student> students;
//声明数据集合BindingList<Student>
private BindingList<Student> studentList;

//构造函数中初始化数据
public Form6() {
    InitializeComponent();

    students = new List<Student>();
    students.Add(new Student(false,"name11", "11", "11"));
    students.Add(new Student(false,"name22", "22", "22"));
    students.Add(new Student(false,"name33", "33", "33"));
    students.Add(new Student(false,"name44", "44", "44"));
    students.Add(new Student(false,"name55", "55", "55"));

    studentList = new BindingList<Student>(students);
    dataGridView1.DataSource = studentList;
}



5. DataGridView添加行代码示例:

private void addBtn_Click(object sender, EventArgs e) {
    Random random = new Random();
    string name = random.Next(100).ToString();
    string age = random.Next(100).ToString();
    string gender = random.Next(100).ToString();
    //当你的数据量特别大的时候,建议先将数据添加进List,再将List装进BindingList中,这样效率可以提高10到100倍
    //添加一个学生对象数据
    students.Add(new Student(false,name, age, gender));
    studentList = new BindingList<Student>(students);
    dataGridView1.DataSource = studentList;
    //这是将表格拉到最后一行
    dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.RowCount - 1;
}

6. DataGridView删除第一行代码示例:

private void delFirstBtn_Click(object sender, EventArgs e) {
    studentList.RemoveAt(0);
}

7. DataGridView删除多行

代码示例:

private void delChecked_Click(object sender, EventArgs e) {
    //  这个for循环只能按倒序来,否则会删错行.假如你是按正序来删除,你要删第一行和第二行,当你删了第一行后,
    //  原本第二行的索引将会由1变成0,而程序执行完.RemoveAt(0),轮到.RemoveAt(1)时,删的是原来的第3行,而不是第二行,错就错在这里.
    for (int i = dataGridView1.Rows.Count - 1; i >=0 ; i--) {
        //检查行是否选中,是删除
        if (dataGridView1.Rows[i].Selected) {
            studentList.RemoveAt(i);
        }
    }
}

8. DataGridView删除选中的CheckBox行,

代码示例:

private void delChecked_Click(object sender, EventArgs e) {
    dataGridView1.ReadOnly = true;
    //先获取当前显示的行号
    int tempIndex = dataGridView1.FirstDisplayedScrollingRowIndex;
    //这里一样,for循环只能用倒序,否则会删错行
    for (int i = studentList.Count - 1; i >=0 ; i--) {
        if (studentList[i].IsChecked) {
            //删除List中索引为i的对象
            students.RemoveAt(i);
        }
    }
    //重新将List装进BindingList并设置数据源
    //不要嫌烦,先操作List在装进BindingList虽然代码量增加了不少,但是当数据量大的时候,效率提升了不是一倍两倍,而是十倍百倍
    studentList = new BindingList<Student>(students);
    dataGridView1.DataSource = studentList;
    //将表格显示的位置移到刚才删除前的位置
    if (dataGridView1.RowCount > 0) {
        if (dataGridView1.RowCount == tempIndex) {
            tempIndex -= 1;
        }
        dataGridView1.FirstDisplayedScrollingRowIndex = tempIndex;
    }
    dataGridView1.ReadOnly = false;
}

9.DataGridViewCheckBoxColumn点击列名全选/取消全选

这里有个坑,只要焦点在某一个CheckBox单元格中中,那么全选时总有一个无法选中或者取消选中,解决办法就是先设置为只读,全选完之后在取消只读

代码示例:

private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) {
    if (e.ColumnIndex==0) {
        dataGridView1.ReadOnly = true;
        string val = dataGridView1.Columns[0].HeaderText;
        if (val.Equals("全选")) {
            dataGridView1.Columns[0].HeaderText = "取消";
            //这里操作的是BindingList而不是List,原因是这里做的是修改的操作,而不是增删的操作,效率差不了多少,所以无需先操作List再重新绑定
            //非常不建议直接操作表格行,原因也是通过索引获取表格中的内容效率极差的问题
            //for (int i = dataGridView1.Rows.Count - 1; i >= 0; i--) {
            //    dataGridView1.Rows[i].Cells[0].Value = false;
            //}
            for (int i = studentList.Count - 1; i >= 0; i--) {
                studentList[i].IsChecked = true;
            }
            //修改后要刷新一下表格,否则可能数据变更界面显示会有延时
            dataGridView1.Refresh();
        } else {
            dataGridView1.Columns[0].HeaderText = "全选";
            for (int i = studentList.Count - 1; i >= 0; i--) {
                studentList[i].IsChecked = false;
            }
            dataGridView1.Refresh();
        }
        dataGridView1.ReadOnly = false;
    }
}

 

备注:代码你们自己放进命名空间内,这里我就没有写命名空间了.


  • 5
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值