谨以此篇博客记录研究一天DataGridView控件增删改,在第一次机房时添加和删除操作员是并不都是在DataGridView控件上进行的,这次我想既然用这个控件都用了,何不试一下都在上面进行呢,于是有了这篇博客
先看下界面吧
当增删改查碰撞到一起会发生什么故事,您接着向下看
添加
添加会有两种方式
未绑定数据源
private void btnAdd_Click(object sender, EventArgs e)
{
if (table==null)
{
//没有绑定数据时添加行
//控件的行加1
dataGridView1.Rows.Add();
//总行数减一赋予rc作为最后一个的索引
int rc = dataGridView1.Rows.Count - 1;
//为最后一行的行头赋予N,标识增加行
dataGridView1.Rows[rc].HeaderCell.Value = "N";
}
绑定数据源(即点查询之后)添加数据行,这个需要你的数据表允许NULL值
else
{
//绑定数据时添加行
//创建一个和当前绑定表格相同架构的行
DataRow dr = table.NewRow();
//索引值等于总行数,如果总行数等于0则,索引值等于0,否则当前选中行索引值+1
int index = dataGridView1.RowCount == 0 ? 0 : dataGridView1.CurrentRow.Index + 1;
//将新行插入到index的位置
table.Rows.InsertAt(dr, index);
//在行头显示为N
dataGridView1.Rows[index].HeaderCell.Value = "N";
}
删除
这次删除使用了不一样的方法,前做标记并移除
//DataGridViewRow访问控件中的一行
//row为DataGridViewRow类型的局部变量
//dataGridView1.SelectedRows用户选中的行的集合
foreach (DataGridViewRow row in dataGridView1.SelectedRows)
{
//当前行的行头的值为空
if (dataGridView1.Rows[row.Index].HeaderCell.Value ==null)
{
//行头标记为D意为删除
dataGridView1.Rows[row.Index].HeaderCell.Value = "D";
}
//当前行行头为N为添加
else if (dataGridView1.Rows[row.Index].HeaderCell.Value.ToString() == "N")
{
//移除当前行
dataGridView1.Rows.Remove(row);//参数:选中的行
}
//当前行行头标识为U意为更改
else if (dataGridView1.Rows[row.Index].HeaderCell.Value.ToString() == "U")
{
//则标识为D
dataGridView1.Rows[row.Index].HeaderCell.Value = "D";
}
}
修改行
行编辑前事件
//定义记录旧数据变量
string strOlder;
private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
//获取修改之前的数据
//strOlder = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
//Rows为行集合
//cells为列集合
//e.RowIndex为获得此事件的行索引
//e.ColumnIndex为获得此事件的列索引
strOlder = Convert.ToString(dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value);
}
.Tostring()与Convert.ToString的区别
其他参考博客
https://www.cnblogs.com/kissdodog/p/3565988.html
编辑后事件
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
//获取修改之后的数据
string strNew = Convert.ToString(dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value);
if (strOlder != strNew)
{
if (dataGridView1.Rows[e.RowIndex].HeaderCell.Value==null)
{
dataGridView1.Rows[e.RowIndex].HeaderCell.Value = "U";
}
else if (dataGridView1.Rows[e.RowIndex].HeaderCell.Value.ToString()=="D")
{
dataGridView1.Rows[e.RowIndex].HeaderCell.Value = "U";
}
}
}
增删改综合到一起的逻辑
当点击添加按钮时
对于新增加的一行,标识为N,过程中怎么修改都不会为U(修改),因为编辑前为空值,编辑后即保存后的,选中点击删
删除直接删除
当点击删除按钮时
对行头没有值的标记为D,行头为N直接删除,行头为U标记为D,保存后都删除,这是为了防止误删加入了标记
总结
从逻辑可以看出当增删改查综合到一个控件上时,有点混乱,这也就明白了为什么第一次机房要把它们分开了,从用户的角度不建议使用这个方法,会给用户带来操作困难。不过可以练练手,当中会涉及到一个控件的不少的属性及方法,也涉及到不少知识点,比如三元表达式,foreach循环,对于控件中如何取值加索引操作,我觉得这些才是最主要得,得了,不吹牛B了,我去修改了。