机房重构——DataGridView控件增删改

谨以此篇博客记录研究一天DataGridView控件增删改,在第一次机房时添加和删除操作员是并不都是在DataGridView控件上进行的,这次我想既然用这个控件都用了,何不试一下都在上面进行呢,于是有了这篇博客

先看下界面吧

机房重构——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";
    }

}

修改行


机房重构——DataGridView控件增删改

行编辑前事件

//定义记录旧数据变量
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的区别

机房重构——DataGridView控件增删改

其他参考博客

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了,我去修改了。

 

上一篇:WinForm,在另一个线程中更新Form中的数据(转)


下一篇:C# DataGridView中指定的单元格不能编辑