当前位置:编程学习 > C#/ASP.NET >>

C# DataGridView自动提交数据求改善!

这是我七改八改写出的代码,虽然现在没有出错,但总觉得思维有点混乱!
我想实现的功能是,当在DataGridView输入修改数据时能自动提交到数据库,右键可以删除当前行数据!
我用了两个事件一个是CellBeginEdit,另一个是CellEndEdit.
这里有个难点是在CellEndEdit中,当前行无法判断是不是新增的!于是我就在CellBeginEdit事件中设置一个变量用来记录是不是新增,请看代码,有没有更好的实现的方法呢?

   public partial class CPModel : Form
    {
        private DataSet myDS;
        private bool isNesRow = false;
        private OleDbConnection conn=null;
        private OleDbDataAdapter da = null;
        private void binddata()
        {
            conn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0.;Data Source=F:/CPDB.mdb");
            conn.Open();
            string sql = "select * from OriginData";
            da = new OleDbDataAdapter(sql, conn);
            myDS = new DataSet();
            da.Fill(myDS,"OD");
            this.dataGridView1.DataSource = myDS.Tables["OD"].DefaultView;
           this.dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
           this.dataGridView1.RowHeadersVisible = false;
            myDS.AcceptChanges();
        }
        public CPModel()
        {
            InitializeComponent();
            binddata();
           
        }
        private void dataGridView1_CellBeginEdit(object sender,DataGridViewCellCancelEventArgs e)
        {
            if (this.dataGridView1.CurrentRow.IsNewRow)
            {
                isNesRow = true;
            }
        }

        private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            if (myDS.HasChanges())
            {
                for (int i = 0; i < myDS.Tables[0].Columns.Count; i++)
                {
                    if (string.IsNullOrEmpty(myDS.Tables[0].Rows[this.dataGridView1.CurrentRow.Index][i].ToString()))
                    {
                        myDS.RejectChanges();
                        return;
                    }
                }
               
                    if (this.dataGridView1.CurrentRow.Index>=myDS.Tables[0].Rows.Count-1 && isNesRow)
                    {
                        da.InsertCommand = conn.CreateCommand();
                        da.InsertCommand.CommandText = "insert into OriginData values(@Phases,@SpCode)";
                        da.InsertCommand.Parameters.Add("@Phases", OleDbType.VarChar, 10, "Phases");
                        da.InsertCommand.Parameters.Add("@SpCode", OleDbType.VarChar, 10, "SpCode");
                        int count = da.Update(myDS, "OD");
                        bool result = count > 0 ? true : false;
                    }
                    else
                    {
                        isNesRow = false;
                        OleDbParameter sp = new OleDbParameter();
                        da.UpdateCommand = conn.CreateCommand();
                        da.UpdateCommand.CommandText = "update OriginData set Phases=@Phases,SpCode=@SpCode where Phases=@oldid";
                        da.UpdateCommand.Parameters.Add("@Phases", OleDbType.VarChar, 10, "Phases");
                        da.UpdateCommand.Parameters.Add("@SpCode", OleDbType.VarChar, 10, "SpCode");
                        sp = da.UpdateCommand.Parameters.Add("@oldid", OleDbType.VarChar, 10, "Phases");
                        sp.SourceVersion = DataRowVersion.Original;
                        int count = da.Update(myDS, "OD"); 
                        bool result = count > 0 ? true : false;
                  }
            }
        }

        private void CutCurRowMenuItem_Click(object sender, EventArgs e)
        {
            if (this.dataGridView1.CurrentRow != null && this.dataGridView1.CurrentRow.Index<=myDS.Tables[0].Rows.Count-1)
            {
                OleDbParameter sp = new OleDbParameter();
                da.DeleteCommand = conn.CreateCommand();
                da.DeleteCommand.CommandText = "delete from OriginData where Phases=@Phases";
                sp = da.DeleteCommand.Parameters.Add("@Phases", OleDbType.VarChar, 10, "Phases");
                sp.SourceVersion = DataRowVersion.Original;
                myDS.Tables[0].Rows[this.dataGridView1.CurrentRow.Index].Delete();
                int count = da.Update(myDS,"OD");
                bool result = count > 0 ? true : false;
            }
        }

        private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                if (e.RowIndex >= 0)
                {
                    if (this.dataGridView1.Rows[e.RowIndex].Selected == false)
                    {
                        this.dataGridView1.ClearSelection();
                        this.dataGridView1.Rows[e.RowIndex].Selected = true;
                    }
                    if (this.dataGridView1.SelectedRows.Count == 1)
                    {
                        this.dataGridView1.CurrentCell = this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];
                    }
                    this.UserMenu.Show(MousePosition);
                }
            }
        }
     }

--------------------编程问答-------------------- 不晓得你为什么要实现这样的业务功能,对某些行的单元格进行修改、自动保存,那么一行数据修改可能会和数据库交互很多次。
而且,dataset本身有批量修改的功能,即直接对绑定的dataset的DataGridView中数据进行修改,修改完毕后,整体提交即可,为什么要这么麻烦? --------------------编程问答--------------------
引用 1 楼 wolf_y 的回复:
不晓得你为什么要实现这样的业务功能,对某些行的单元格进行修改、自动保存,那么一行数据修改可能会和数据库交互很多次。
而且,dataset本身有批量修改的功能,即直接对绑定的dataset的DataGridView中数据进行修改,修改完毕后,整体提交即可,为什么要这么麻烦?

是这样的,批量修改是不是要按一下按钮才能保存吧?我们在输入数据的时候,如果不实时保存的话,有时忘记点保存按钮了或者突然断电了,那我输的数据就没有了又要重新输入!! --------------------编程问答-------------------- 有必要吗,每行都有个行状态标志的,你不用自己做标记,另外你这实时保存也太频繁了吧,即使没改动也要提交,你可以在cellvaluechanged事件中保存 --------------------编程问答-------------------- 你好,这种方式可行,但如果数据量大可是一个坏的方法。建议,批量新增与修改,然后搞一个保存按钮,让用户手动保存,或设置一个时间,5秒钟自动保存一次等,这样可更行。


=======================================================
.NET快速开发整合框架(RDIFramework.NET),基于.NET的快速开发、整合框架,给用户和开发者最佳的.Net框架部署方案。
平台博客:[CNBLOGS]http://www.cnblogs.com/huyong 
     [CSDN]http://blog.csdn.net/chinahuyong
交流QQ:406590790 (请注明:CSDN)
平台微博:http://t.qq.com/yonghu86
邮件交流:406590790@qq.com
--------------------编程问答--------------------
引用 3 楼 bdmh 的回复:
有必要吗,每行都有个行状态标志的,你不用自己做标记,另外你这实时保存也太频繁了吧,即使没改动也要提交,你可以在cellvaluechanged事件中保存

我对DataGridView不太熟悉,是这一两天学的,改成CellValueChanged事件需要修改什么代码吗?
我这里有个难点,就是如何判断修改的行是新增的还是原来就有的?新增的话就要用insert,修改的话就要用UPDATE,我是用CellBeginEdit事件来做标记,DataGridVIEW本身有个IsNewRow属性,但这个标志在这里就不能判断了。 --------------------编程问答--------------------
引用 4 楼 chinahuyong 的回复:
你好,这种方式可行,但如果数据量大可是一个坏的方法。建议,批量新增与修改,然后搞一个保存按钮,让用户手动保存,或设置一个时间,5秒钟自动保存一次等,这样可更行。


=======================================================
.NET快速开发整合框架(RDIFramework.NET),基于.NET的快速开发、整合框架,给用户和开发者最佳……

搞保存按钮让用户手动保存,这个是不行的,因为用户经常忘记手动保存所以才搞成自动保存的!
5秒种自动保存的话,如果判断数据是新增的还是修改的! --------------------编程问答-------------------- 如果绑定了数据源,可以试验一下下面的代码

            if (dataGridView1.CurrentCell == null)
                return;
            int index=dataGridView1.CurrentCell.RowIndex;
            if (dataGridView1.Rows[index].IsNewRow)
            {
 
            }
--------------------编程问答-------------------- 上个代码MS不可以判断,应该是下面的代码,你试验一下:

        private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            if (dataGridView1.CurrentCell == null)
                return;
            DataRowView item = (DataRowView)dataGridView1.Rows[e.RowIndex].DataBoundItem;
            if (item.IsNew)
            {
 
            }
        }
--------------------编程问答--------------------
引用 8 楼 wolf_y 的回复:
上个代码MS不可以判断,应该是下面的代码,你试验一下:


C# code
?



1234567891011

        private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)         {             if (dataGridVi……


现在不用判断是不是新增了,OleDbDataAdapter会自动判断! --------------------编程问答-------------------- 安装前面的提示修改了,不需要判断是不是新增了,DataAdapter会自动判断,只需要把inert和update的语句写好就行了!


        private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            if (myDS.HasChanges())
            {
                for (int i = 0; i < myDS.Tables[0].Columns.Count; i++)
                {
                    if (string.IsNullOrEmpty(myDS.Tables[0].Rows[this.dataGridView1.CurrentRow.Index][i].ToString()))
                    {
                        myDS.RejectChanges();
                        return;
                    }
                }
                da.InsertCommand = conn.CreateCommand();
                da.InsertCommand.CommandText = "insert into OriginData values(@Phases,@SpCode)";
                da.InsertCommand.Parameters.Add("@Phases", OleDbType.VarChar, 10, "Phases");
                da.InsertCommand.Parameters.Add("@SpCode", OleDbType.VarChar, 10, "SpCode");
                OleDbParameter sp = new OleDbParameter();
                da.UpdateCommand = conn.CreateCommand();
                da.UpdateCommand.CommandText = "update OriginData set Phases=@Phases,SpCode=@SpCode where Phases=@oldid";
                da.UpdateCommand.Parameters.Add("@Phases", OleDbType.VarChar, 10, "Phases");
                da.UpdateCommand.Parameters.Add("@SpCode", OleDbType.VarChar, 10, "SpCode");
                sp = da.UpdateCommand.Parameters.Add("@oldid", OleDbType.VarChar, 10, "Phases");
                sp.SourceVersion = DataRowVersion.Original;
                int count = da.Update(myDS, "OD");
                bool result = count > 0 ? true : false;
                }
        }
--------------------编程问答-------------------- 不建议实时提交,频繁交互会影响性能 --------------------编程问答-------------------- 如果是绑定数据表的话,控件内任何操作都会直接反映到数据表中,所以新增和修改可以直接.Update(数据表.Tables[0])即可,不写任何代码,只用一条必须的SELECT * FROM...语句.
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,