DataGridView中有一列是ComboBox,DataGridView绑定一个datatable,ComboBox也绑定一个datatable。
在ComboBox的ComboBox_SelectedIndexChanged事件中改变DataGridView其他单元格的值的时候,报错,
报错信息是:设置DataSource属性后无法修改项集合!这个问题怎么解决?
另外在网上查到说绑定DataError事件,我绑定后不会报错了,变成死机了!我跟了程序,发现在不停的执行DataError事件,直接执行到死机!

解决方案 »

  1.   

    楼主在更改 ComboBox项的时候重新给DataGridView绑定值试着这样写:
    DataGridView.DataSource=null;
    DataGridView.DataSource=datatable;
    同理,如果你的ComboBox要重新绑定值的话也照上面的写法写下试试。
     
      

  2.   

    就是在ComboBox_SelectedIndexChanged事件里写这些吧?
    我试一下!
      

  3.   

    Combobox的DataSource若是一次性载入集合,则Combobox里面的每一项都为只读,不允许修改的。你在SelectIndexChange事件时是否改变了Combobox的选项值。可以看一下。我个人推荐不要把赋值给Datagridview单元格的行为绑定到Combobox的SelectIndexChange事件。我个人是这样做的:
        Private Sub DataGridView1CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick, DataGridView1.CellEnter
            Try
                With Me.DataGridView1
                    ’combobox绑定到第四列,当单击时,或键盘移入时显示并赋值
                    If e.ColumnIndex = 4 Then
                        Me.ComboBoxProductType.Left = .GetCellDisplayRectangle(4, e.RowIndex, True).Left + 6
                        Me.ComboBoxProductType.Top = .GetCellDisplayRectangle(4, e.RowIndex, True).Top + 11
                        Me.ComboBoxProductType.Width = .GetCellDisplayRectangle(4, e.RowIndex, True).Width
                        .Rows(e.RowIndex).Cells(4).Value = Me.ComboBoxProductType.Text.Trim
                        Me.ComboBoxProductType.Visible = True
                    Else
                        Me.ComboBoxProductType.Visible = False
                    End If
                End With
            Catch ex As Exception
                MsgBox(ex.ToString)
            End Try
        End Sub
    这样可以很好的实现用Combobox给Datagridview单元格赋值的效果。仅供参考,希望对你有所帮助!
      

  4.   

    有一个问题,我在ComboBox_SelectedIndexChanged事件里写这两行代码,我ComboBox无法改变值!
      

  5.   

    C#代码这样写的:
    private void // ERROR: Handles clauses are not supported in C# DataGridView1CellClick(object sender, System.Windows.Forms.DataGridViewCellEventArgs e) 

        try { 
            { 
                //combobox绑定到第四列,当单击时,或键盘移入时显示并赋值 
                if (e.ColumnIndex == 4) { 
                    this.ComboBoxProductType.Left = this.DataGridView1.GetCellDisplayRectangle(4, e.RowIndex, true).Left + 6; 
                    this.ComboBoxProductType.Top = this.DataGridView1.GetCellDisplayRectangle(4, e.RowIndex, true).Top + 11; 
                    this.ComboBoxProductType.Width = this.DataGridView1.GetCellDisplayRectangle(4, e.RowIndex, true).Width; 
                    this.DataGridView1.Rows(e.RowIndex).Cells(4).Value = this.ComboBoxProductType.Text.Trim; 
                    this.ComboBoxProductType.Visible = true; 
                } 
                else { 
                    this.ComboBoxProductType.Visible = false; 
                } 
            } 
        } 
        catch (Exception ex) { 
            Interaction.MsgBox(ex.ToString); 
        } 

      

  6.   

     //ComBox框的值有更改时,更新时间并保存更改
            void cboState_SelectedIndexChanged(object sender, EventArgs e)
            {
                 dgvInfo.CurrentCell.Value = cboState.Text;            dgvInfo.CommitEdit((DataGridViewDataErrorContexts)123);
                dgvInfo.BindingContext[dgvInfo.DataSource].EndCurrentEdit();
                dgvInfo_CellEndEdit(null, null);
            }我用了ComBox后,排序后再更改值,会出错。
      

  7.   

    当连续点击comboBox时会死机,但是点击comboBox后点击别的控件,再来点击comboBox时就不会出错!
    很多奇怪的事情!
      

  8.   

    你数据源用DataView试一下,可能是你用的数据源不是DataSet对象。
      

  9.   

    根据你描述的异常看来,你改变了一个绑定了DataSource的ComboBox的Items的值对吧?这是不允许的。你先检查你的代码,为什么ComboBox设置了数据源还要修改Items,这是矛盾的。
      

  10.   

    不是,我是在ComboBox的ComboBox_SelectedIndexChanged事件中改变了DataGridView的值。
      

  11.   

    你改变的DataGridView哪一列的值?这一列是个什么类型的Column?根据异常信息,好像是修改了DataGridView当中一列ComboBoxColumn类型的单元格的值。
      

  12.   

    你给ComboBoxColumn那一列有没有设置DataPropertyName,如果ComboBoxColumn设置了DataSource,那就不要再设置DataPropertyName了。
      

  13.   

    改变了DataGridView中和当前ComboBox一行的某一列的值,这一列是TextboxColumn类型
      

  14.   


    DataGridViewComboBoxColumn Fparmrangedesc = new DataGridViewComboBoxColumn();
    Fparmrangedesc.DataPropertyName = "Fparmrangecoding";//设置数据源属性的名称
    Fparmrangedesc.HeaderText = "参数值域";//列头显示的汉字
    Fparmrangedesc.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox;
    Fparmrangedesc.DataSource = dtReportParmRangeT;//ComboBox绑定的数据源
    Fparmrangedesc.DisplayMember = "Fparmrangedesc";//显示值
    Fparmrangedesc.ValueMember = "Fparmrangecoding";//实际值
    dgView.Columns.Add(Fparmrangedesc);
      

  15.   

    我试了一下,把我的
    Fparmrangedesc.DataPropertyName = "Fparmrangecoding";//设置数据源属性的名称
    这句注释掉,这个ComboBoxColumn就不显示值了,空白!
    有下拉框,但是选择完以后又成空白了!
      

  16.   

    不知道楼主的问题解决没有,楼主这个问题我还没遇到过,主要是还没得这个需求。但是我觉得是  ComboBox_SelectedIndexChan……这个事件的问题,因为这个事件在触发的时候都是要绑定一次数据源的,楼主可以试试,想将 事件 -=  然后  +=
      

  17.   

    我感觉到也是这个问题,曾经在ComboBox_SelectedIndexChanged事件中-=自己,+=自己过,效果不明显!
      

  18.   

    Fparmrangedesc.DataPropertyName = "Fparmrangecoding";//设置数据源属性的名称
    其中“Fparmrangecoding”应该是DataGridView.DataSource的Table的某一个列的名称,这个你应该知道吧?
    另外为什么下面三句已经给Fparmrangedesc这个Column绑定了DataSource,还要再让这个Column显示DataGridView.DataSource里面的值呢,这是矛盾的。
    Fparmrangedesc.DataSource = dtReportParmRangeT;//ComboBox绑定的数据源
    Fparmrangedesc.DisplayMember = "Fparmrangedesc";//显示值
    Fparmrangedesc.ValueMember = "Fparmrangecoding";//实际值
    另外,你的ComboBox_selectIndexChanged是挂的DataGridView.EditingControl的事件对吧,这一点我也觉得很奇怪。
      

  19.   

    下面的那个Fparmrangecoding和Fparmrangedesc都是ComboBox绑定的数据源dtReportParmRangeT里面的字段名,其中ValueMember必须和这一列的DataPropertyName绑定一样的列名(是列名不是同一列,是两个不同datatable的相同的列名)才能有连动的效果!
    我的ComboBox_selectIndexChanged里没有挂DataGridView.EditingControl事件呀!
      

  20.   

    “在ComboBox的ComboBox_SelectedIndexChanged事件中改变DataGridView其他单元格的值的时候,报错,
    报错信息是:设置DataSource属性后无法修改项集合!”
    可能是我理解了太差,你上面所说的“在ComboBox的ComboBox_SelectedIndexChanged事件中改变DataGridView其他单元格的值的时候”,这里的ComboBox指的是谁?DataGridViewComboBoxColumn有SelectedIndexChanged这样的事件吗?你修改DataGridView上面的单元格的值的Code是什么样子的?
    因为我是做类似DataGridView这样的控件的,因此,我对你所说的需求比较感兴趣。
      

  21.   

    我理解了一下的你的需求:
    在DataGridView的某个ComboBoxCell当中选择一个值之后,在编辑状态的情况下不需要按Enter键,把选择的值更新到当前Row的其他一个TextBoxCell的值。是不是这个意思呢?
      

  22.   

    我写代码把SelectedIndexChanged事件加上去的,你可以看看下面我总结的方法
    http://blog.csdn.net/hejialin666/archive/2009/12/19/5036871.aspx
      

  23.   

    就是这个意思,在DataGridViewComboBoxColumn的SelectedIndexChanged事件里就是写
    datatable1.rows[e.RowIndex]["strName"] = "KKK";
    就是当前行的strName字段的值给改变了,其中datatable1就是DataGridView绑定的数据源。