呕心沥血原创,转载请注明出处!
目录
2.设置 DataGridView第一列值为CheckBox类型,
4. DataGridView绑定List集合,首先初始化BindingList数据,如果你的集合是List,必须要将List转成BindingList,界面才能根据你集合的变化而变化
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集合,首先初始化List和BindingList数据,如果你的集合是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;
}
}
备注:代码你们自己放进命名空间内,这里我就没有写命名空间了.