2016-03-11 3 views
0

У меня есть простой DataGridView, заполненный материалом, теперь я хочу, чтобы иметь возможность щелкнуть правой кнопкой мыши по левой стороне, чтобы выделить всю строку, чтобы я мог вставить или удалить целую строку. Я искал это некоторое время, но большую часть времени это для отдельных ячеек, я ищу контекстное меню, которое используется для целых строк.Создайте Right Click Menu в dataGridView для всей строки

Существует еще один вопрос, похожий, но в конечном итоге не совсем то, что я пытаюсь сделать.

Благодарим вас заранее!

+0

Вопросы, требующие помощи по отладке («почему этот код не работает?») Должны включать в себя желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для воспроизведения в самом вопросе. Вопросы без четкого описания проблемы не полезны другим читателям. См. [Как создать минимальный, завершенный и проверяемый пример] (http://stackoverflow.com/help/mcve). –

+0

Я пробовал несколько вещей, но ничто, кажется, не совсем то, что я пытаюсь выполнить, и мой код просто становится беспорядочным и беспорядочным. На самом деле все, что я хочу сделать, это возможность вставить строку в объект dataGridView во время работы программы. Вы можете удалить строки, выделив строку и нажав «delete», но нажатие «insert» ничего не делает. :( – Argv

+0

Мы не волшебники с хрустальным шаром. Мы не можем видеть ваш код. Мы не можем видеть ваше приложение. Мы не можем видеть, что не так. Вы должны представить рабочий пример. В противном случае stackoverflow не является сайт, чтобы задать этот вопрос. Если вы прочитаете справку, обычно такие вопросы будут закрыты offtopic/слишком широкими/непонятными, что вы просите. Удачи. –

ответ

0

Я нашел довольно простой способ сделать то, что хотел. Это выглядит следующим образом:

первую очередь, подключить событие MouseDown:

dataGridView1.MouseDown += new MouseEventHandler(this.dataGridView1_MouseClick); 

затем, создать подпрограмму со-ответ на событие MouseDown ..

private void dataGridView1_MouseClick(Object sender, MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Right) 
     { 
      ContextMenu cm = new ContextMenu(); 
      this.ContextMenu = cm; 
      cm.MenuItems.Add(new MenuItem("&Cut", new System.EventHandler(this.cut_Click))); 
      cm.MenuItems.Add(new MenuItem("&Copy", new System.EventHandler(this.copy2_Click))); 
      cm.MenuItems.Add(new MenuItem("&Paste", new System.EventHandler(this.paste2_Click))); 



      cm.Show(this, new Point(e.X, e.Y)); 
     } 

    } 

Затем добавить свой такие как:

private void cut_Click(Object sender, EventArgs e) 
    { 
     if (this.dataGridView1.GetCellCount(DataGridViewElementStates.Selected) > 0) 
     { 
      try 
      { 
       Clipboard.SetDataObject(this.dataGridView1.GetClipboardContent()); 
      } 
      catch (System.Runtime.InteropServices.ExternalException) 
      { 
       MessageBox.Show("Clipboard could not be accessed. Please try again."); 
      } 
     } 

     if (this.dataGridView1.SelectedRows.Count > 0) 
     { 
      dataGridView1.Rows.RemoveAt(this.dataGridView1.SelectedRows[0].Index); 
     } 

    } 

, который добавит скопированные ячейки к доске клипов. Затем, чтобы вставить их, что-то вроде:

private void paste2_Click(Object sender, EventArgs e) 
    { 
     char[] rowSplitter = { '\r', '\n' }; 
     char[] columnSplitter = { '\t' }; 

     // Get the text from clipboard 
     IDataObject dataInClipboard = Clipboard.GetDataObject(); 
     string stringInClipboard = (string)dataInClipboard.GetData(DataFormats.Text); 

     // Split it into lines 
     string[] rowsInClipboard = stringInClipboard.Split(rowSplitter, StringSplitOptions.RemoveEmptyEntries); 

     // Get the row and column of selected cell in grid 
     int r = dataGridView1.SelectedCells[0].RowIndex; 
     int c = dataGridView1.SelectedCells[0].ColumnIndex; 

     // Add rows into grid to fit clipboard lines 
     if (dataGridView1.Rows.Count < (r + rowsInClipboard.Length)) 
     { 
      dataGridView1.Rows.Add(r + rowsInClipboard.Length - dataGridView1.Rows.Count); 
     } 

     // Loop through the lines, split them into cells and place the values in the corresponding cell. 
     for (int iRow = 0; iRow < rowsInClipboard.Length; iRow++) 
     { 
      // Split row into cell values 
      string[] valuesInRow = rowsInClipboard[iRow].Split(columnSplitter); 

      // Cycle through cell values 
      for (int iCol = 0; iCol < valuesInRow.Length; iCol++) 
      { 

       // Assign cell value, only if it within columns of the grid 
       if (dataGridView1.ColumnCount - 1 >= c + iCol) 
       { 
        DataGridViewCell cell = dataGridView1.Rows[r + iRow].Cells[c + iCol]; 

        if (!cell.ReadOnly) 
        { 
         cell.Value = valuesInRow[iCol+1]; 
        } 
       } 
      } 
     } 
    } 

Я использую [седловины + 1], так как первый элемент в списке всегда является пустым («»). Надеюсь, это поможет кому-то. Меня устраивает! : D