none
修改datagridview RRS feed

  • 问题

  •         private bool SearchDataBindDataGridView2(int mid)
            {
                try
                {
                    conn = SqlHelper.GetConnnection();
                    sda = new SqlDataAdapter("select * from DetailInfo where mid="+mid, conn);
                    DataTable dt = new DataTable();
                    sda.Fill(dt);
                    this.dataGridView2.DataSource = dt;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                    return false;
                }
                conn.Close();
                return true;
            }

    根据条件mid绑定datagridview,然后修改datagridview并更新

            private bool UpdateDataBindDataGridView2(int mid)
            {
                try
                {
                    conn = SqlHelper.GetConnnection();
                    DataTable dt = new DataTable();
                    sda.Fill(dt);
                    SqlCommandBuilder scb = new SqlCommandBuilder(sda);
                    foreach (DataGridViewRow row in dataGridView2.Rows)
                    {
                        row.Cells["mid"].Value = mid;
                    }
                    sda.Update(dt);
                    dt.AcceptChanges();
                    //this.dataGridView2.Update();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                    return false;
                }
                clearDataGridView();
                return true;
            }

    可是datagridview并没有更新,还是之前根据mid绑定的数据,请教下根据条件获得的datagridview如何更新呢?

    2011年9月26日 1:47

答案

全部回复

  • 你只更新了DataGird的数据(数据只是显示在dataGrid中,和数据库无关了,当然无法更新)

    解决方法——必须更新DataTable中的:

     conn = SqlHelper.GetConnnection();
    DataTable dt = new DataTable();
    sda.Fill(dt);
    SqlCommandBuilder scb = new SqlCommandBuilder(sda);
    foreach (DataRow row in dt.Rows)
    {
    row["mid"].Value = mid;
    }
    sda.Update(dt);
    dt.AcceptChanges();


    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    If you do not have QQ, please open the page and download it and click the image to talk or leave message for me.
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处
    2011年9月26日 2:39
    版主
  • 我也发现这个问题了 我按照你的方法去更新datatable了

    后来我把代码改成这样

                    conn = SqlHelper.GetConnnection();
                    DataTable dt = new DataTable();
                    //sda.Fill(dt);
                    dt = dvtodt(this.dataGridView2);//把当前datagridview里的值给datatable,结果提示我mid列不属于表
                    //SqlCommandBuilder scb = new SqlCommandBuilder(sda);
                    foreach (DataRow row in dt.Rows)
                    {
                        row["mid"] = mid;
                    }
                    sda.Update(dt);
                    dt.AcceptChanges();
                    this.grainWinFormDataSet.AcceptChanges();

    列“mid"不属于表.可是我追踪datatable的时候是有这列的啊

    还有我刚才按照你给我的那个方法 试了下 还是没有写到数据库去,dt里面始终只有之前取到的数据.

    • 已编辑 heartg 2011年9月26日 2:58
    2011年9月26日 2:53
  • 这样做修改:

    for (int i=0;i<dt.Rows.Count;++i)
    {
        dt.Rows[i][你的mid对应的索引列]="更新值";

    }


    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    If you do not have QQ, please open the page and download it and click the image to talk or leave message for me.
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处
    2011年9月26日 2:57
    版主
  • 可以了 不是不是update 是insert了

    SqlCommandBuilder scb = new SqlCommandBuilder(sda);这个不是可以识别是update insert delete嘛?

    如何能让其作为更新数据操作呢?

    2011年9月26日 3:24
  • 可以了 不是update 是insert了

    SqlCommandBuilder scb = new SqlCommandBuilder(sda);这个不是可以识别是update insert delete嘛?

    如何能让其作为更新数据操作呢?

    如果你是一张表,并且有主键,应该这样做是可以的。

    另外:

    dt.AcceptChanges();
    this.grainWinFormDataSet.AcceptChanges();

    可以不要,请删除。


    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    If you do not have QQ, please open the page and download it and click the image to talk or leave message for me.
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处
    2011年9月26日 4:50
    版主
  • 奇怪了,没有update原来的数据,而是新插入了数据

            //将DataGridView转换成DataTable
            public static DataTable dvtodt(DataGridView dv)
            {
                DataTable dt = new DataTable();
                DataColumn dc;
                for (int i = 0; i < dv.Columns.Count; i++)
                {
                    dc = new DataColumn();
                    dc.ColumnName = dv.Columns[i].DataPropertyName.ToString() ;
                    //dc.ColumnName = dv.Columns[i].HeaderText.ToString();
                    dt.Columns.Add(dc);
                }
                for (int j = 0; j < dv.Rows.Count-1; j++)
                {
                    DataRow dr = dt.NewRow();
                    for (int x = 0; x < dv.Columns.Count; x++)
                    {
                      dr[x] = dv.Rows[j].Cells[x].Value;
                    }
                    dt.Rows.Add(dr);
                }
                return dt;
            }

    //根据mid将符合条件的数据绑定给datagridview2

    private bool SearchDataBindDataGridView2(int mid)
    {
    try
    {
    conn = SqlHelper.GetConnnection();
    sda = new SqlDataAdapter("select * from DetailInfo where mid="+mid, conn);
    SqlCommandBuilder scb = new SqlCommandBuilder(sda);
    DataTable dt = new DataTable();
    sda.Fill(dt);
    //this.detailInfoBindingSource.DataSource=dt;
    this.dataGridView2.DataSource = dt;
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.ToString());
    return false;
    }
    conn.Close();
    return true;
    }

    //更新datagridview2,更新的时候将当前datagridview2转换成datatable然后更新在这种情况下就成了insert新的数据了

            private bool UpdateDataBindDataGridView2(int mid)
            {
                try
                {
                    conn = SqlHelper.GetConnnection();
                    DataTable dt = new DataTable();
                    dt = dvtodt(this.dataGridView2);
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        dt.Rows[i][0] = mid;
                    }
                    sda.Update(dt);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                    return false;
                }

                return true;
            }

    请教一下,表都是一张表,还是没有进行更新,这段代码在理论上还有什么问题吗?

     

     

     


    • 已编辑 heartg 2011年9月26日 6:12
    2011年9月26日 6:04
  • 当然有错误……

    public static DataTable dvtodt(DataGridView dv)

    {
        ……………………
          dt.Rows.Add(dr);     //这样一来,几乎全部的Row的State编变成Added状态了,此时自动调用Insert语句。
         
    dt.AcceptChanges(); //加这句话,必须这样做,把Added改成Unchanged!

    }


    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    If you do not have QQ, please open the page and download it and click the image to talk or leave message for me.
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处


    2011年9月26日 6:13
    版主
  • 可以了 太好了 多谢了
    2011年9月26日 6:53
  • 可以了 太好了 多谢了

    不用谢!希望你多多来MSDN,同时尽己所能,多多帮助别人!!!
    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    If you do not have QQ, please open the page and download it and click the image to talk or leave message for me.
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处
    2011年9月27日 5:49
    版主