问题是这样的:我想获取一个用于选择的模式对话框的内容,然后用代码修改DataGridView单元格的内容模式对话框是使用CellDoubleClick事件显示的开始的时候,我使用DataTable和DataGridView绑定,然后修改DataTable的单元格内容,只是不添加行的修改是没有问题的,如果需要添加行的话,就会出问题,我使用的是如下代码
private void ExecProductSelectDialog(DataGridViewCellEventArgs e)
{
      ProductSelect productSelect = new ProductSelect();
      productSelect.ShowDialog();
            
           
      if (productSelect.IsSubmited)
      {
           if (e.RowIndex == dtOrder.Rows.Count)//当点击最下面的空行时
           {
                DataRow dr = dtOrder.NewRow();
                dr[0] = productSelect.Product.Brand;//Brand中存放productSelect中选择的结果,是String类型
                dtOrder.Rows.Add(dr);
                dgvSaleList.DataSource = dtOrder;
           }
       }当需要在DataTable中添加一行的,但是DataGridView控件中会显示添加两行,上面一行是我添加的并且修改的,下面一行是自己多出的空行。(最下面还有一行DataGridView原本就有的空行,我指的多出来的行不是只这行)
后来我尝试不使用DataTable来绑定,想直接使用DataGridView.Rows.Add()方法来添加行
但是单元格的内容怎么修改不了呢?
if(e.RowIndex == dgvSaleList.Rows.Count - 1)
                {
                    dgvSaleList.Rows.Add();
                }
                dgvSaleList.Rows[e.RowIndex].Cells[0].Value = productSelect.Product.Brand;                if(e.RowIndex == dgvSaleList.Rows.Count - 1)
                {
                    dgvSaleList.Rows.Add();
                }
                DataGridViewTextBoxCell cell0 = new DataGridViewTextBoxCell();
                cell0.Value = productSelect.Product.Brand;
                dgvSaleList.Rows[e.RowIndex].Cells[0] = cell0;两种方式都不行。使用第一种方式的话,在调试的时候,对Value赋值的语句执行后,Value值依旧是null,没有改变。求问大大们。。如何解决这个问题。。谢谢。。

解决方案 »

  1.   

    刚才又试了一下如果把添加行事件单独放到一个按钮中触发,就可以正常的添加行了(使用DataTable绑定的方式)
    看来是点击最下面一个空行的事件里的问题。但是具体的原因还是不明白。。还有DataGridView单元格怎么赋值呢。。还是不清楚。。
      

  2.   

    在DataTable添加一行后,DataGridView认为该行是Accept的,是实行。此时最后一行是待修改的虚行。所以你看到了两个空行。此时,设置DataGridView的AllowUserToAddRows属性为false,最后的虚行不存在
      

  3.   

    单元格给值就是 dataGridView1.Rows[n].Cells[m].Value = ...
      

  4.   

    在cellFormatting事件里试试改变DataGridView单元格的值
      

  5.   

    谢谢两位大大的回复,
    回复huihui:
    我没有说清,是这样的,假设我没有对新添加的行内容进行编辑,点击最下面的空行后,本来想要出现的效果是有两个空行,比原来多了一个空行,这是想要的效果。
    但是实际的效果是,点击最下面的空行后,一次性的添加了两行,也就是说,现在是有三个空行在末尾。。我有在调试里看过,第一次运行完AddRow以后,DataTable的行数从原来的0变成了1,这是正确的,然而,函数运行过后,界面显示出的,却是添加了两行。如果再次点击最下面的空行,再次进入添加行的事件中,我发现DataTable的行数自己变成了2。。退出函数前Count是1,再次进入的时候就变成了2。。还有说到DataGridView单元格的。真的太奇怪了,为什么就不行呢。。赋值完了还是null回复wxhx0502:
    cellFormating事件是怎么触发的呢?为什么我打开窗体后,就使劲的弹出模式对话框,一个关了就再出现一个。。好像不太适合。。
      

  6.   

    而且应该不是是因为最后一行不能赋值。第一次赋值的时候e.index = 0,DataGridView的rowCount是1,此时我就添加一个新行了。赋值的是倒数第二行。使用DataGridView不绑定DataTable时的代码效果就是可以正常添加一个新行。。但是这个新行里赋不进值。。
      

  7.   

    添加两行是对的,一行是你自己添加的,另一行是自动的,当你再点击空行的时候会认为你自己又添加了一行,DataTable的行数也会变成2是因你DataTable绑定dataGridView,这时两个的值是互动的
    你完全可以把新增的行隐藏掉,LZ是不是担心隐藏掉后会在添加行时报错?这个隐藏的代码你可以写在dataGridView的网络全部绘制完成的事件里,那样就不会报错了
      

  8.   

    你赋值的时候如果只定哪行赋值可以
    dataGridView.Rows[dataGridView.RowCount-1].Cells[列索引].Values=值
    循环赋的话直接
    for(int i=0;i<dataGridView.RowCount-1;i++)
    {
    //..
    }看了下你前面的代码:  if(e.RowIndex == dgvSaleList.Rows.Count - 1)
    {
       dgvSaleList.Rows.Add();
    }
    DataGridViewTextBoxCell cell0 = new DataGridViewTextBoxCell();
    cell0.Value = productSelect.Product.Brand;
    dgvSaleList.Rows[e.RowIndex].Cells[0] = cell0;
    你这个是什么意思呢?如果你之前dataGridView.Rows[e.RowIndex].Cells[0]是有值的话
    你修改时可以直接赋值的
    dataGridView.Rows[e.RowIndex].Cess[0].Value="值";