虽然已经发了五张贴,而且每张100分。但是都没有结,大家不要急,问题一解决,在下马上结所有的贴。
在这里首先感谢“人生如梦”、“沐浴月光”、“在这里设置的哇”、“逍遥”、“jointan”、“龍月.NET”等几位大侠对在下的帮助。你们所教的,俺都设置了,但是效果貌似不是在下想要的,所以换下思路。功能描述:
有一个DataGridView控件(GridView_XFXM),在它下方有两个按钮分别是“保存”(BC_XFXM),“删除”(SC_XFXM)。当在DataGridView控件中修改了里面的记录的值之后,点击保存则保存修改后的记录到数据库。点击删除,则删除当前选择行。请问各位大侠这样的功能怎样实现比较好,说说思路,最好给点代码或实例,嘿嘿在下先说说自己的思路:将DataGridView控件中的数据读入到“DataTable控件”中,当修改“DataGridView控件中”中的数据时,修改相应的“DataTable控件”中的数据。保存将“DataTable控件”中的数据提交到数据库。删除时,删除相应的“DataTable控件”中的数据,同时将“DataTable控件”中的数据提交到数据库。这只是在下鄙陋的思路。渴望各位大侠更好的思路。但是,在下的思路中还存在几个问题。
问题一:以前都是将DataTable中的数据绑定到GridView中,怎样将“DataGridView”中的数据读入到“DataTable控件”中就不会了。
问题二:怎样在修改“DataGridView”中的数据时,同时修改相应的“DataTable”中的数据?
问题三:怎样获得“DataGridView”当前选择行的行号,根据行号删除“DataTable”中的数据?
问题四:怎样用“OleDbDataAdapter”将“DataTable”控件中的数据提交到数据库,进行更新。
请各位大侠,能静下心对小弟指点一二,在下的项目快完工了哦,谢谢你们

解决方案 »

  1.   

    忘了贴绑定代码了。代码:
    //“消费项目”绑定GridView

      string sql_xfxm_bdgv = "select * from xfxmb ";
      DataTable dt_xfxm_bd = access.FillDt(sql_xfxm_bdgv);
      GridView_XFXM.DataSource = dt_xfxm_bd;
      this.GridView_XFXM.Columns[0].HeaderCell.Value = "序号";
      this.GridView_XFXM.Columns[1].HeaderCell.Value = "推荐日期";
      this.GridView_XFXM.Columns[2].HeaderCell.Value = "消费名称";
      this.GridView_XFXM.Columns[3].HeaderCell.Value = "金额";
      this.GridView_XFXM.Columns[4].HeaderCell.Value = "操作员";
      

  2.   

    不明白你是要修改(或删除)一个就保存一个还是在datagridview中弄好后再全部保存呢?
    如果是弄操作一个处理一个,捕获datagridview的editend时间,编辑完后根据编辑数据行中的关键字构造sql操作到数据库中就行了,全部操作完后在处理可以弄个sql数组把操作都保存下来,然后通过数据库的事务一次处理完。
      

  3.   

    可以通过BindingSource控件设置DataGridView控件的DataSource属性。
    //下面的是删除按钮的代码
     try
                {
                    if (MessageBox.Show("确定删除该信息吗?", "系统提示!", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
                    {
                        //删除当前记录
                        this.bindingSource1.RemoveCurrent();
                        //将结果更新
                        this.Invalidate();
                        this.bindingSource1.EndEdit();
                        this.MySqlDataAdapter.Update(MyDataSet, MyTable);
                    }            }
                catch (SqlException ex)
                {
                    MessageBox.Show(ex.Message, "提示信息!", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
                }
    当然首先要绑定数据
    SqlConnection conn = new SqlConnection("-------");
                string MySql = "select *-------";
    private string MyTable = "TABLE";
      //获得数据适配器对象
                SqlDataAdapter mysql = new SqlDataAdapter(MySql);
          
                //给数据适配器对象添加表映射
                MySqlDataAdapter.TableMappings.Add("Table", MyTable);
                //设置数据适配器对象的查询语句
                MySqlDataAdapter.SelectCommand = new SqlCommand(MySql, conn);
                //绑定数据适配器对象
                MySqlCommandBulider = new SqlCommandBuilder(MySqlDataAdapter);
      //定义一个数据集对象
             DataSet MyDataSet = new DataSet();
                //填充数据集
                MySqlDataAdapter.Fill(MyDataSet);
                //赋予数据绑定对象的数据源属性
                this.bindingSource1.DataSource = this.MyDataSet;
                //赋予数据绑定对象的数据成员属性
                this.bindingSource1.DataMember = MyTable;
                //赋予数据网格对象的数据源属性
                this.dataGridView1.DataSource = this.bindingSource1;
      

  4.   

    呵呵 话说么做过winform
    哎 么办法
    希望楼主搞定。
      

  5.   

    第一问DataTable dt = new DataTable(); 
    dt = ((DataView)this.dataGridView1.DataSource).Table;
    第二问:
    我有个问题你DataGridView数据源应该是个DateSet或者DataTable吧?那你直接让他们用一个数据源不就对了~比如说你都用DataSet 更新DataGridView 后用适配器调用Update(Table)方法 不就更新了吗。。是我想错了 还是怎么了 。。我咋越看越不对劲           
                //自动生成用于更行的相关命令 dataadapter是之前声明
                SqlCommandBuilder builder = new SqlCommandBuilder(dataadapter);
                //将数据集中表的数据提交给数据库更新
                dataadapter.Update(Table);//这个方法有重载!可以直接更新你的数据库
    第三个问题。。
    string strUserName = this.dataGridView1.CurrentCell.Value.ToString(); 
    第四个问题
    跟第二个一样
    先创建连接,查询语句
    然后创建适配器
    然后创建 SqlCommandBuilder 
    然后用dataadapter.update()方法执行更新
      

  6.   


    您可以把您做的实例的代码或是类给俺发一份吗,想参考下,在下的邮箱:[email protected]谢谢了
      

  7.   


    先做下说明在下用的数据库是“Access”。恩,是有数据源“DataTable”,但是那个数据源是从数据库获得数据,然后绑定到“GridView”的。而现在需要的数据源应该是要从“DataGridView”获取数据,然后更新到数据吧。原来那个应该不可以用吧?
      

  8.   

    感觉楼主钻牛角尖了,为什么一定要绑定呢?我总感觉绑定不好用虽然有的时候少写很多代码,但一点都不灵活,M$的控件不是万能的,像这样简单的功能还不如不绑定,多写几行代码来搞定这个问题,会很简单的;使用控件只是一方面的技能,不能说明什么,如果换个其它的开发语言(c++,java,delphi)估计你又要重新、像新手一样学习了,我就有这样的经历,所以我劝楼主还是学些实在的内在的东西比较好;并且我非常鄙视有些公司面试时,使用....连接个数据库显示到控件上呀,xxx控件怎么使用呀要达到什么效果如何设置呀类似的问题太多太多了;;;
      

  9.   

    你的问题  加入checkbox  多半可以解决还有就是添加一个保存按钮  事件里要写把更新的后的数据保存到dt 然后  根据这个dt  返回到数据库看你自己的了, 下班了  
      

  10.   

    问题一:以前都是将DataTable中的数据绑定到GridView中,怎样将“DataGridView”中的数据读入到“DataTable控件”中就不会了。
    问题二:怎样在修改“DataGridView”中的数据时,同时修改相应的“DataTable”中的数据?
    问题三:怎样获得“DataGridView”当前选择行的行号,根据行号删除“DataTable”中的数据?
    关于前三个问题:
    将DataGridView的DataSource属性 赋值后,DataTable已经与控件绑定后,添修改、删除DataGridView,绑定的DataTable也将改变。
    可以使用DataGridView.DataSource as DataTable获取修改后的数据源。问题四:怎样用“OleDbDataAdapter”将“DataTable”控件中的数据提交到数据库,进行更新。我没有使用这个更新数据库。datatable有个方法GetChange();他可以获取datatable所有修改的行。
    根据rowstate编辑sql语句,通过sql事务更新。这样万一有错误,可以回滚到没有修改前。
      

  11.   

    //以下是伪代码,不知道对楼主有没有帮助,
    //假设这个是更新按钮
    private void btnUpdate_Click(object sender, EventArgs e)
            {
                UpdateData();
            }
    private void  UpdateData()
    {
       //总共行
          for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
        {
             string strColumn1= dataGridView1.Rows[i].Cells[j].Value;
             //假设ID绑定在第一列
             string strID= dataGridView1.Rows[i].Cells[0].Value;
             //执行更新
              //更新成功后要重新绑定一下dataGridView
             //BindData();
         
        }
    }
    //删除同理
      

  12.   

    问题一:你有必要将“DataGridView”中的数据读入到“DataTable吗?
    问题二:你更新数据了,datagridview.Rows.clear(),重新绑定一次数据源
    问题三:如果你按钮是单独的,int rownum=this.dataGridView1.CurrentRow.Index; 
      

  13.   


    额~都一样么~你用Access 和sql server 都一样~只不过一个sqlconnection 一个是OleDbConnection 其他都是一样的~ 就前面的名字不一样。。一个sql 一个oledb 
    不管你用什么控件~数据源就一个对吧~那你Dgv吧数据源修改后~你那个Dt在刷一边不就完了么!最省事!
    我邮箱:[email protected]不建议的话的话把你项目要求给我看看~~我到现在还没弄懂你想咋做
      

  14.   


    加你好友了。有个朋友说。
    直接操作grid的数据源就可以了:首先你从数据库取数据DataTable dt = GetDataFromDB();
    然后绑定到grid:DataGrid.DataSource=dt;当你直接修改grid中的数据时,dt中的数据也会变化,你只需要将dt更新到数据库就行了。
    在下还是有点疑惑:
    为什么“直接修改grid中的数据时,dt中的数据也会变化”?
    如果是删除“DataGridView”中的一行“dt”也跟着变化?
      

  15.   

    简单的说,DataGridView单元格的内容被修改后,它会通知他的数据源(比如DataTable),包括发生新增,修改和删除.
      

  16.   


    你那个朋友说的就是我想的。。你直接修改数据源~你就是绑定10个 他10个也会跟着变首先你从数据库取数据DataTable dt = GetDataFromDB();
    然后绑定到grid:DataGrid.DataSource=dt;这个朋友说的对这呢啊你删除一行~也是从数据源里删除一行你数据源都变了 ,,你其他绑定这个数据源的 控件 也不是就变了
      

  17.   

    说说asp.net的GridView给你参考GridView是可以设置DataKey的 不显示出来 做为某Row的主键 同时也是数据库的中ID
    ....... ........建议不要将DataGridView读取到DataTable中
    每次修改直接从数据库中重新绑定搜一下GridView 72般绝技
    可以作为参考
      

  18.   

    这个是我以前写过的一段代码,不过也是从网上抄袭而来,我用的是toolbar其中if(e.button.tooltiptext=="XX")就是相当于button_click事件 if(e.Button.ToolTipText=="新增")
    {
    cmOrders.AddNew();//新增一条记录
                    SetDefaultValue();//设置默认值
    SetModifyMode(true);//设置控件只读等属性
    }
    if(e.Button.ToolTipText=="修改")
    {
    SetModifyMode(true);
    }
    if(e.Button.ToolTipText=="删除")
    {

    DialogResult result=MessageBox.Show("确认删除?","删除数据",MessageBoxButtons.OKCancel);
    if(result==DialogResult.OK)
    if(cmOrders.Count>0)//立即从数据集中删除
    {
    cmOrders.RemoveAt(cmOrders.Position);
    da1.Update(dataSet11);
    }
    else
    MessageBox.Show("表中为空,已无可删除数据","提示",MessageBoxButtons.OK,MessageBoxIcon.Error);
    }
    if(e.Button.ToolTipText=="提交")
    {
    bool canSubmit;
    canSubmit=this.CheckNotNull();
    if(canSubmit==false)//有非空值字段为空,不允许提交
    {
    return;
    }
    cmOrders.EndCurrentEdit();
    if(dataSet11.GetChanges()!=null)
    {
    try
    {
    da1.Update(dataSet11);
    SetModifyMode(false);
    }
    catch(Exception express)
    {
    MessageBox.Show(express.ToString(),"提示",MessageBoxButtons.OK,MessageBoxIcon.Error);
    dataSet11.RejectChanges();
    }
    }
    return;
    }