none
通过程序设置datagridview中某一行某几个cell的数值,焦点离开后,cell数据自动又变成空栏,是什么原因? RRS feed

  • 问题

  • 通过程序设置datagridview中某一行某几个cell的数值,焦点离开后,cell数据自动又变成空栏,是什么原因?


    数据源绑定语句如下:

                  if (this.orderNo == null)
                    {
                        sql = "select sProduct as 品名,nBrand as 牌子,nEncap as 封装,sOrderDate as 要求日期,sRealDate as 交货日期,nStock as 仓库位置,nAmount as 数量,nPrice as 单价,nSum as 总额,sRemark as 备注 from order where";
                    }
                    else
                    {
                        sql = "select sProduct ,nBrand ,nEncap ,sOrderDate ,sRealDate ,nStockCode ,nOrderAmount ,nPrice ,nTotalSum ,sRemark  from order where";
                    }
                 
                    if(this.tbOrder.Text.Trim() == ""){
                        sql += " sOrderNo = '0'";
                    }else{
                        sql += " sOrderNo = '" + this.tbOrder.Text.Trim() + "'";
                    }

                    SqlDataAdapter ad = new SqlDataAdapter(sql,conn);
                    this.ds = new DataSet();
                    ad.Fill(this.ds,"order");
                    this.datagridviewOrder.DataSource = ds.Tables[0];
    2009年5月24日 7:37

答案

全部回复

  • 你好!
         数据绑定的代码没有什么问题,你通过程序设置datagridview中某一行某几个cell的数值的相关代码可以提供一下吗?
    周雪峰
    2009年5月24日 8:04
    版主
  • 您好,

    从另一个查询窗口from设置本窗口from,源窗口datagridview(datagridviewOrder)和当前行号(rowindex2)通过参数传递到查询窗口

    在查询窗口中设置源窗口form的datagridview当前行的某几个Cell,语句如下:
                        DataRow datarow = this.ds.Tables[0].Rows[currentIndex];
                        datagridviewOrder.Rows[rowindex2].Cells[0].Value = datarow["产品编号"];
                        datagridviewOrder.Rows[rowindex2].Cells[1].Value = datarow["牌子编号"];
                        datagridviewOrder.Rows[rowindex2].Cells[2].Value = datarow["封装"];
                        datagridviewOrder.Rows[rowindex2].Cells[7].Value = Math.Round((decimal)datarow["销售价"], 2);



    2009年5月24日 8:12
  • 你好,使用下面的方式设置一下试试

                DataRow datarow = this.ds.Tables[0].Rows[currentIndex];
                DataRow fDataRow = (DataRow)this.dataGridView1.SelectedRows[0].DataBoundItem;
                fDataRow[0] = datarow["产品编号"];
        .....


    知识改变命运,奋斗成就人生!
    2009年5月24日 8:22
    版主
  • 你好,使用下面的方式设置一下试试

                DataRow datarow = this.ds.Tables[0].Rows[currentIndex];
                DataRow fDataRow = (DataRow)this.dataGridView1.SelectedRows[0].DataBoundItem;
                fDataRow[0] = datarow["产品编号"];
        .....


    知识改变命运,奋斗成就人生!


    您好,

    好像不行,报错说:未处理的“System.NullReferenceException”类型的异常出现在 ems.exe 中。

                             其他信息: 未将对象引用设置到对象的实例。


    2009年5月24日 8:31
  • 你好,这样试试
    DataRow datarow = this.ds.Tables[0].Rows[currentIndex];
                DataRow fDataRow = (DataRow)this.dataGridView1.Rows[rowindex2].DataBoundItem;
                fDataRow[0] = datarow["产品编号"];

    知识改变命运,奋斗成就人生!
    2009年5月24日 8:42
    版主
  • 既然已经做了数据绑定,如果你需要通过代码修改数据,则直接修改数据源中的数据即可。DataGridView控件会自动根据数据源更新的。

    理解的越多,需要记忆的就越少
    2009年5月24日 8:59
    版主
  • 你好,这样试试
    DataRow datarow = this.ds.Tables[0].Rows[currentIndex];
                DataRow fDataRow = (DataRow)this.dataGridView1.Rows[rowindex2].DataBoundItem;
                fDataRow[0] = datarow["产品编号"];

    知识改变命运,奋斗成就人生!


    您好,

         结果是一样的,出现同样的问题:未将对象引用设置到对象的实例。

        是否datagridview没有有效绑定? 我对datagridview里的column做了一些初始设定,语句如下:

              对datagridviewOrder中的某些栏目做了如下设置:

                this.datagridviewOrder.Columns.Clear();
                this.datagridviewOrder.CellDoubleClick += new DataGridViewCellEventHandler(datagridviewOrder_DoubleClick);

                DataGridViewComboBoxColumn cmbProductNO      = new DataGridViewComboBoxColumn(); //产品编号


            cmbProduct.FlatStyle       = FlatStyle.Flat  ;
                cmbProduct.Name = "品名";
                cmbProduct.HeaderText       = "品名";
                cmbProduct.DataPropertyName = "sProductCode";
                cmbProduct.ReadOnly = true;
                cmbProduct.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing;

                this.datagridviewOrder.Columns.Add(cmbProduct);

                cmbProduct.Width = 220;


                 ......



    2009年5月24日 9:07
  • 既然已经做了数据绑定,如果你需要通过代码修改数据,则直接修改数据源中的数据即可。DataGridView控件会自动根据数据源更新的。

    理解的越多,需要记忆的就越少


    数据源中数据为空,当前datagridviewOrder的状态是新增一条记录;

    修改也是一样,即使datagridviewOrder中有数据,在后面新增一行的话,焦点离开,则cell数据又恢复为空栏。     

    2009年5月24日 9:13
  • 能否所完整的代码发出来看看呢,
    知识改变命运,奋斗成就人生!
    2009年5月24日 9:21
    版主
  • 对DataTable数据源NewRow(),再赋值,datagridviewOrder也没有任何显示。
    宁静致远,淡泊明志
    2009年5月24日 9:21
  • FormOrder:

                  if (this.orderNo == null)
                    {
                        sql = "select sProduct as 品名,nBrand as 牌子,nEncap as 封装,sOrderDate as 要求日期,sRealDate as 交货日期,nStock as 仓库位置,nAmount as 数量,nPrice as 单价,nSum as 总额,sRemark as 备注 from order where";
                    }
                    else
                    {
                        sql = "select sProduct ,nBrand ,nEncap ,sOrderDate ,sRealDate ,nStockCode ,nOrderAmount ,nPrice ,nTotalSum ,sRemark  from order where";
                    }
                 
                    if(this.tbOrder.Text.Trim() == ""){
                        sql += " sOrderNo = '0'";
                    }else{
                        sql += " sOrderNo = '" + this.tbOrder.Text.Trim() + "'";
                    }

                    SqlDataAdapter ad = new SqlDataAdapter(sql,conn);
                    this.ds = new DataSet();
                    ad.Fill(this.ds,"order");
                    this.datagridviewOrder.DataSource = ds.Tables[0];


    之后根据双击column事件,弹出FormProduct,列出相关产品信息,点击某一行后,作如下赋值,再返回FormOrder

    FormProduct(查询产品):
                       
                        DataRow datarow = this.ds.Tables[0].Rows[currentIndex];
                        datagridviewOrder.Rows[rowindex2].Cells[0].Value = datarow["产品编号"];
                        datagridviewOrder.Rows[rowindex2].Cells[1].Value = datarow["牌子编号"];
                        datagridviewOrder.Rows[rowindex2].Cells[2].Value = datarow["封装"];
                        datagridviewOrder.Rows[rowindex2].Cells[7].Value = Math.Round((decimal)datarow["销售价"], 2);


    复制完毕,返回后,datagridviewOrder中Cell数据可见,然而一旦焦点离开,cell数据便恢复为空栏。


    宁静致远,淡泊明志
    2009年5月24日 9:32
  • 楼主的rowindex2怎么来的?是直接取的控件中的带星号的新行的索引吗?
    理论上对数据源NewRow再赋值应该是有用的。确定你是调用数据源的NewRow方法吗?
    你利用如下的代码创建新行,以保证新行建立到数据库上:
    DataTable dt = datagridviewOrder.DataSource as DataTable;
    DataRow row = dt.NewRow();



    理解的越多,需要记忆的就越少
    2009年5月24日 13:44
    版主
  • 尝试把对dataGridView的修改改为对数据源进行修改,
    知识改变命运,奋斗成就人生!
    2009年5月25日 1:05
    版主
  • datagridviewOrder.EndEdit();
    http://feiyun0112.cnblogs.com/
    2009年5月25日 2:30
    版主