2015-07-10 2 views
1

Исключение типа «System.InvalidOperationException» произошло в System.Windows.Forms.dll, но не обрабатывалось в коде пользователя Дополнительная информация: Строки не могут быть программно удалены, если DataGridView не является с привязкой к данным к IBindingList, который поддерживает уведомление об изменении и позволяет удалятьWinforms datagridview: drag and drop вызывает ошибку

Это, как я связываю свои данные в DataGridView:

IEnumerable<myTable> query = from p in db.myTables select p; 
     testList = query.ToList(); 
     dataGridView1.DataSource = testList; 

и это то, что я использую, чтобы перетащить & падение строки:

 private void dataGridView1_MouseClick(object sender, MouseEventArgs e) 
    { 
     if (dataGridView1.SelectedRows.Count == 1) 
     { 
      if (e.Button == MouseButtons.Left) 
      { 
       rw = dataGridView1.SelectedRows[0]; 
       rowIndexFromMouseDown = dataGridView1.SelectedRows[0].Index; 
       dataGridView1.DoDragDrop(rw, DragDropEffects.Move); 
      } 
     } 
    }   
    private void dataGridView1_DragEnter(object sender, DragEventArgs e) 
    { 
     if (dataGridView1.SelectedRows.Count > 0) 
     { 
      e.Effect = DragDropEffects.Move; 
     } 
    } 
    private void dataGridView1_DragDrop(object sender, DragEventArgs e) 
    { 

     int rowIndexOfItemUnderMouseToDrop; 
     Point clientPoint = dataGridView1.PointToClient(new Point(e.X, e.Y)); 
     rowIndexOfItemUnderMouseToDrop = dataGridView1.HitTest(clientPoint.X, clientPoint.Y).RowIndex; 

     if (e.Effect == DragDropEffects.Move) 
     { 
      dataGridView1.Rows.RemoveAt(rowIndexFromMouseDown); 
      dataGridView1.Rows.Insert(rowIndexOfItemUnderMouseToDrop, rw); 
     } 
    } 

Всякий раз, когда я пытался перетащить & drop, перетаскивание в порядке, но падение вызывает ошибку, о которой я упоминал выше, и, если возможно, я не хочу использовать список привязок, потому что если я его использую, мне придется внести много изменений. Если вы можете помочь, я буду признателен.

+1

Если вы хотите двустороннюю привязку, вам нужно будет использовать список привязки. – SpaceSteak

+0

Я не уверен, как это сделать. Это не работает 'IEnumerable query = from p in db.EFESRDP0s select p; testList = query.ToList(); var list = new BindingList (testList); dataGridView1.DataSource = list; ' – BarisY

+0

Не настолько, насколько мне известно, хотя вы можете попробовать сделать некоторые исследования для альтернативы. – SpaceSteak

ответ

0

У меня проблема. Я вносил изменения в события мыши.

private void dataGridView1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if ((e.Button & MouseButtons.Left) == MouseButtons.Left) 
     {     
      if (dragBoxFromMouseDown != Rectangle.Empty && !dragBoxFromMouseDown.Contains(e.X, e.Y)) 
      {          
       DragDropEffects dropEffect = dataGridView1.DoDragDrop(dataGridView1.Rows[rowIndexFromMouseDown], DragDropEffects.Copy); 
      } 
     } 
    } 
    private void dataGridView1_MouseDown(object sender, MouseEventArgs e) 
    { 
     // Get the index of the item the mouse is below. 
     rowIndexFromMouseDown = dataGridView1.HitTest(e.X, e.Y).RowIndex; 
     if (rowIndexFromMouseDown != -1) 
     {        
      Size dragSize = SystemInformation.DragSize; 
      dragBoxFromMouseDown = new Rectangle(new Point(e.X - (dragSize.Width/2), e.Y - (dragSize.Height/2)), dragSize); 
     } 
     else    
      dragBoxFromMouseDown = Rectangle.Empty; 
    } 
    private void dataGridView1_DragOver(object sender, DragEventArgs e) 
    { 
     e.Effect = DragDropEffects.Copy; 
    } 
    private void dataGridView1_DragDrop(object sender, DragEventArgs e) 
    { 
     try 
     { 
      if (e.Data.GetDataPresent(typeof(DataGridViewRow))) 
      { 
       Point clientPoint = dataGridView1.PointToClient(new Point(e.X, e.Y));     
       if (e.Effect == DragDropEffects.Copy) 
       { 
        DataGridViewRow Row = (DataGridViewRow)e.Data.GetData(typeof(DataGridViewRow)); 
        dataGridView1.Rows.Add(Row.Cells[0].Value, Row.Cells[1].Value, Row.Cells[2].Value); 
       } 
      } 
      else 
      { 
       //Reflect the exception to screen 
       MessageBox.Show("Geen data! #01", "Error"); 
      } 
     } 
     catch (Exception msg) 
     { 
      MessageBox.Show(msg.Message, "Error"); 
     } 
    }