一个datagridView,一个按钮
如下面,我只需要每次跟换选中行的时候,能再次填充成功高手帮助看看啊,急死了!!!!!!!!!!!!!!!!
 private void button1_Click(object sender, EventArgs e)
        {
            dgvData.CurrentCellChanged -= new EventHandler(dgvData_CurrentCellChanged);
            DataTable dt = getdate(3);
            this.dgvData.DataSource = dt;
            dgvData.CurrentCellChanged += new EventHandler(dgvData_CurrentCellChanged);
        }        private DataTable getdate(int m)
        {           
            DataTable dt = new DataTable();
            dt.Columns.Add("id");
            DataRow dr1 = dt.NewRow();
            dr1["id"] = m - 1;
            dt.Rows.Add(dr1);
            DataRow dr2 = dt.NewRow();
            dr2["id"] = m ;
            dt.Rows.Add(dr2);
            DataRow dr3 = dt.NewRow();
            dr3["id"] = m + 1;
            dt.Rows.Add(dr3);                      return dt;            
        }  private void dgvData_CurrentCellChanged(object sender, EventArgs e)
        {            
            int n = this.dgvData.CurrentRow.Index;
            DataTable dtm = (DataTable)dgvData.DataSource;
            DataRow dr = dtm.Rows[n];
            int a = Convert.ToInt16(dr["id"]);            DataTable dt = getdate(a+1);
            this.dgvData.DataSource = dt;//就是这里,在选中当前行时,不应许再填充????????
        }

解决方案 »

  1.   


    先点button1没问题,在移动当前行,Operation is not valid because it results in a reentrant call to the SetCurrentCellAddressCore function.这个错,搞死人
      

  2.   

    this.dgvData.DataSource 重新绑定前,加上这么一句话试试:
              this.dgvData.DataSource=null
      

  3.   

    我现在是用两个datagridview替换才能做到,不过很闪,用户不用
      

  4.   

    它导致对 SetCurrentCellAddressCore 函数的可重入调用
    是否有数据
      

  5.   

    DataGridView控件好像默认绑定数据源后会默认第一行为当前行,所以你每次变换数据源肯定会触发事件,所以你这种写法估计怎么都不行了。
    给个建议,换事件来模拟这个效果(比如点击DataGridView,键盘的光标键事件等)。
    凭空想的,未验证,只是个建议啊。
      

  6.   

    private void dgvData_CurrentCellChanged(object sender, EventArgs e)
            {            
                int n = this.dgvData.CurrentRow.Index;
                DataTable dtm;
                //int a = Convert.ToInt16(dr["id"]);
                int a=Convert.ToInt16(this.dgvData.CurrentRow["id"]);            DataTable dt = getdate(a+1);
                this.dgvData.DataSource = dt;//就是这里,在选中当前行时,不应许再填充????????
            }
    我没试过,意思就是找取当前行的"id"所在单无格,取出id.
      

  7.   

    这种是会出现问题,
    因为cell改变的时候需要调用SetCurrentCellAddressCore进行改变
    当你重新绑定时,当前活动状态的单元格发生了改变,出现问题吧
    你换一个别的事件处理吧,用CellValueChanged事件处理
      

  8.   

    dgvData_CellLeave用这个事件也无效
      

  9.   


    我要的效果是,更换当前行时,取出当前行数据,然后根据当前行数据,找出相匹配的三条数据填充到datagridview,我感觉是选中这个datagridview的当前行时是不能填充它的,现在我需要方法
      

  10.   

    如果需要“在选中当前行时,不应许再填充”,那么你应该在RowEnter事件中处理。另外我不明白你那个填充什么意思,似乎不是填充当前行,而是改变了所有行。
    因为private DataTable getdate(int m)返回的永远只有3行,如果这就是你的目的,那我就不多说了。
      

  11.   

    如果你一定要把数据源整个替换掉,那你就不能使用CurrentCellChanged事件了,因为那个事件会循环触发,其实和Grid任何相关的事件都不能使用,你只能使用MouseClick事件,那个事件不会因为Grid刷新而循环触发,如果需要支持键盘,你还需要添加KeyDown事件。现在有事要出去,下午给你整理下代码。
      

  12.   

    太谢谢了,我等着啊其实我就是需要得到很肯定的答复,CurrentCellChanged事件不可能做到这样,除非两个gird切换
      

  13.   


            private void button1_Click(object sender, EventArgs e)
            {
                //部分代码可以放置到Form_Load中执行。
                  this.dgvData.MultiSelect = false;
                dgvData.MouseClick -= new MouseEventHandler(dgvData_MouseClick);
                dgvData.KeyDown -= new KeyEventHandler(dgvData_KeyDown);
                DataTable dt = getdate(3);
                this.dgvData.DataSource = dt;
                dgvData.MouseClick += new MouseEventHandler(dgvData_MouseClick);
                dgvData.KeyDown += new KeyEventHandler(dgvData_KeyDown);
            }        private void dgvData_MouseClick(object sender, MouseEventArgs e)
            {
                if (n == -1 || n != this.dgvData.CurrentRow.Index)
                {
                    n = this.dgvData.CurrentRow.Index;
                    DataTable dtm = (DataTable)dgvData.DataSource;
                    DataRow dr = dtm.Rows[n];
                    int a = Convert.ToInt16(dr["id"]);                DataTable dt = getdate(a + 1);
                    this.dgvData.DataSource = dt;                this.dgvData.Rows[n].Cells[0].Selected = true;//设置当前选中行。
                }
            }        void dgvData_KeyDown(object sender, KeyEventArgs e)
            {
                if (e.KeyCode == Keys.Down || e.KeyCode == Keys.Up || e.KeyCode == Keys.Tab)
                {
                    if (n == -1 || n != this.dgvData.CurrentRow.Index)
                    {
                        n = this.dgvData.CurrentRow.Index;
                        DataTable dtm = (DataTable)dgvData.DataSource;
                        DataRow dr = dtm.Rows[n];
                        int a = Convert.ToInt16(dr["id"]);                    DataTable dt = getdate(a + 1);
                        this.dgvData.DataSource = dt;                    this.dgvData.Rows[n].Cells[0].Selected = true;//设置当前选中行。
                    }
                }
            }        int n = -1;//定义外部变量n,用于记录上次选择行。
    如果纯鼠标操作,且每次更新dgvData后,无需记录当前选中行,则可将
    this.dgvData.Rows[n].Cells[0].Selected = true;//设置当前选中行。
    改为
    n = -1;//初始化上次选择行。
      

  14.   

    DBgride触发change事件之后本来就会自动填充, 而change事件中又手工填充, 存在冲突, 所以有reentrant报错信息了. 不要把填充操作放在change事件中