Я нашел довольно простой способ сделать то, что хотел. Это выглядит следующим образом:
первую очередь, подключить событие 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
Вопросы, требующие помощи по отладке («почему этот код не работает?») Должны включать в себя желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для воспроизведения в самом вопросе. Вопросы без четкого описания проблемы не полезны другим читателям. См. [Как создать минимальный, завершенный и проверяемый пример] (http://stackoverflow.com/help/mcve). –
Я пробовал несколько вещей, но ничто, кажется, не совсем то, что я пытаюсь выполнить, и мой код просто становится беспорядочным и беспорядочным. На самом деле все, что я хочу сделать, это возможность вставить строку в объект dataGridView во время работы программы. Вы можете удалить строки, выделив строку и нажав «delete», но нажатие «insert» ничего не делает. :( – Argv
Мы не волшебники с хрустальным шаром. Мы не можем видеть ваш код. Мы не можем видеть ваше приложение. Мы не можем видеть, что не так. Вы должны представить рабочий пример. В противном случае stackoverflow не является сайт, чтобы задать этот вопрос. Если вы прочитаете справку, обычно такие вопросы будут закрыты offtopic/слишком широкими/непонятными, что вы просите. Удачи. –