2010-06-14 65 views
48

Tôi có vài cột trong DataGridView của mình và có dữ liệu trong các hàng của tôi. Tôi thấy vài giải pháp ở đây, nhưng tôi không thể kết hợp chúng!Nhấp chuột phải để chọn một hàng trong Datagridview và hiển thị menu để xóa nó

Chỉ cần một cách để nhấp chuột phải vào một hàng, nó sẽ chọn toàn bộ hàng và hiển thị menu có tùy chọn xóa hàng và khi tùy chọn được chọn, nó sẽ xóa hàng.

Tôi đã thực hiện một vài lần nhưng không có cách nào hoạt động và có vẻ lộn xộn. Tôi nên làm gì?

+0

Câu hỏi của bạn là quá mơ hồ. Thêm các chi tiết khác mà bạn gặp sự cố. Những gì bạn đang cố gắng làm, không phải là rất khó khăn. – leppie

Trả lời

84

cuối cùng tôi giải quyết nó:

  • Trong Visual Studio, tạo ra một ContextMenuStrip với một mục gọi là "DeleteRow"

  • Sau đó tại liên kết DataGridView các ContextMenuStrip

Sử dụng mã dưới đây đã giúp tôi làm việc.

this.MyDataGridView.MouseDown += new System.Windows.Forms.MouseEventHandler(this.MyDataGridView_MouseDown); 
this.DeleteRow.Click += new System.EventHandler(this.DeleteRow_Click); 

Dưới đây là phần mát mẻ

private void MyDataGridView_MouseDown(object sender, MouseEventArgs e) 
{ 
    if(e.Button == MouseButtons.Right) 
    { 
     var hti = MyDataGridView.HitTest(e.X, e.Y); 
     MyDataGridView.ClearSelection(); 
     MyDataGridView.Rows[hti.RowIndex].Selected = true; 
    } 
} 

private void DeleteRow_Click(object sender, EventArgs e) 
{ 
    Int32 rowToDelete = MyDataGridView.Rows.GetFirstRow(DataGridViewElementStates.Selected); 
    MyDataGridView.Rows.RemoveAt(rowToDelete); 
    MyDataGridView.ClearSelection(); 
} 

Tôi hy vọng các mã sẽ giúp đỡ người khác :-)

tôi hoan nghênh bất kỳ sự điều chỉnh nếu có một lỗi.

+0

Xin chào bạn sử dụng điều khiển nào trong DeleteRow_Click? – Crimsonland

+0

có nó là bấm –

+0

Câu trả lời này dường như không hoạt động khi sự kiện 'ContextMenuStripNeeded' xuất hiện trên lưới. Sử dụng 'CellMouseDown' hoạt động. –

1
private void MyDataGridView_MouseDown(object sender, MouseEventArgs e) 
{ 
    if(e.Button == MouseButtons.Right) 
    { 
     MyDataGridView.ClearSelection(); 
     MyDataGridView.Rows[e.RowIndex].Selected = true; 
    } 
} 

private void DeleteRow_Click(object sender, EventArgs e) 
{ 
    Int32 rowToDelete = MyrDataGridView.Rows.GetFirstRow(DataGridViewElementStates.Selected); 
    MyDataGridView.Rows.RemoveAt(rowToDelete); 
    MyDataGridView.ClearSelection(); 
} 
3

Đó là dễ dàng hơn nhiều để thêm chỉ sự kiện cho mousedown:

private void MyDataGridView_MouseDown(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Right) 
    { 
     var hti = MyDataGridView.HitTest(e.X, e.Y); 
     MyDataGridView.Rows[hti.RowIndex].Selected = true; 
     MyDataGridView.Rows.RemoveAt(rowToDelete); 
     MyDataGridView.ClearSelection(); 
    } 
} 

Đây là dễ dàng hơn. Của cource bạn phải init của bạn mousedown-sự kiện như đã được đề cập với:

this.MyDataGridView.MouseDown += new System.Windows.Forms.MouseEventHandler(this.MyDataGridView_MouseDown); 

trong nhà xây dựng của bạn.

28

Để hoàn thành câu hỏi này, tốt hơn nên sử dụng sự kiện Lưới thay vì chuột.

Đầu tiên Thiết lập các thuộc DataGrid của bạn:

SelectionMode để FullRowSelect và RowTemplate/ContextMenuStrip đến một menu ngữ cảnh.

Tạo sự kiện CellMouseDown: -

private void myDatagridView_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Right) 
    { 
     int rowSelected = e.RowIndex; 
     if (e.RowIndex != -1) 
     { 
      this.myDatagridView.Rows[rowSelected].Selected = true; 
     } 
     // you now have the selected row with the context menu showing for the user to delete etc. 
    } 
} 
+0

Câu trả lời này hoạt động khi có 'ContextMenuStripNeeded'. Các giải pháp dựa trên 'MouseDown' thì không. –

+0

@peter Làm cách nào để lấy chỉ mục các hàng nếu nhiều hàng được chọn? – Vbp

+0

Xin chào vbp, tôi nghĩ bạn sẽ cần phải nêu ra một câu hỏi mới nếu chưa được trả lời, câu hỏi này đề cập đến việc chọn chỉ 1 hàng. – peterincumbria

0

Bạn cũng có thể làm điều này một chút đơn giản hơn bằng cách sử dụng sau đây bên trong mã sự kiện:

private void MyDataGridView_MouseDown(object sender, MouseEventArgs e) 
{  
    if (e.Button == MouseButtons.Right)  
    {   
     rowToDelete = e.RowIndex; 
     MyDataGridView.Rows.RemoveAt(rowToDelete);   
     MyDataGridView.ClearSelection();  
    } 
} 
+0

Thao tác này sẽ chỉ xóa hàng mà không có cảnh báo hoặc xác nhận. Tôi chắc chắn OP không muốn điều đó. – ProfK

0

Xem ở đây nó có thể được thực hiện bằng cách sử dụng DataGridViewRowTemplate tài sản.

Lưu ý: Mã này chưa được kiểm tra nhưng trước đây tôi đã sử dụng phương pháp này.

// Create DataGridView 
DataGridView gridView = new DataGridView(); 
gridView.AutoGenerateColumns = false; 
gridView.Columns.Add("Col", "Col"); 

// Create ContextMenu and set event 
ContextMenuStrip cMenu = new ContextMenuStrip(); 
ToolStripItem mItem = cMenu.Items.Add("Delete"); 
mItem.Click += (o, e) => { /* Do Something */ };   

// This makes all rows added to the datagridview use the same context menu 
DataGridViewRow defaultRow = new DataGridViewRow(); 
defaultRow.ContextMenuStrip = cMenu; 

Và ở đó bạn đi, dễ dàng như vậy!

2

Tất cả các câu trả lời được đặt ra cho câu hỏi này đều dựa trên sự kiện nhấp chuột. Bạn cũng có thể chỉ định một số ContenxtMenuStrip cho số DataGridview và kiểm tra xem có hàng nào được chọn khi người dùng RightMouseButtons trên DataGridView và quyết định xem bạn có muốn xem ContenxtMenuStrip hay không. Bạn có thể làm như vậy bằng cách thiết lập giá trị CancelEventArgs.Cancel trong các Opening event của ContextMenuStrip

private void MyContextMenuStrip_Opening(object sender, CancelEventArgs e) 
    { 
     //Only show ContextMenuStrip when there is 1 row selected. 
     if (MyDataGridView.SelectedRows.Count != 1) e.Cancel = true; 
    } 

Nhưng nếu bạn có một vài dải menu ngữ cảnh, với mỗi chứa tùy chọn khác nhau, tùy thuộc vào sự lựa chọn, tôi sẽ đi cho một Chuột nhấp vào tiếp cận bản thân mình là tốt.

6
private void dgvOferty_CellContextMenuStripNeeded(object sender, DataGridViewCellContextMenuStripNeededEventArgs e) 
    { 
     dgvOferty.ClearSelection(); 
     int rowSelected = e.RowIndex; 
     if (e.RowIndex != -1) 
     { 
      this.dgvOferty.Rows[rowSelected].Selected = true; 
     } 
     e.ContextMenuStrip = cmstrip; 
    } 

TADA: D. Thời gian cách dễ nhất. Đối với các ô tùy chỉnh, chỉ cần sửa đổi một chút.

+1

Phương pháp tốt nhất, cũng hoạt động khi chỉ sử dụng bàn phím. Tuy nhiên được cảnh báo: chỉ hoạt động nếu một DataSource được đính kèm. MSDN về DataGridView.CellContextMenuStripNeeded Sự kiện: "Sự kiện CellContextMenuStripNeeded xảy ra chỉ khi DataGridView kiểm soát DataSource tài sản được thiết lập hoặc tài sản VirtualMode của nó là đúng." –

+0

Biến 'cmstrip' tham chiếu là gì? – reformed

1

cơ sở trên @ dữ liệu cơ sở câu trả lời nó sẽ không hoạt động cho đến khi chế độ làm lựa chọn FullRow

MyDataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect; 

nhưng nếu bạn cần để làm cho nó làm việc trong CellSelect Chế độ

MyDataGridView.SelectionMode = DataGridViewSelectionMode.CellSelect; 

// for cell selection 
private void MyDataGridView_MouseDown(object sender, MouseEventArgs e) 
{ 
    if(e.Button == MouseButtons.Right) 
    { 
     var hit = MyDataGridView.HitTest(e.X, e.Y); 
     MyDataGridView.ClearSelection(); 

     // cell selection 
     MyDataGridView[hit.ColumnIndex,hit.RowIndex].Selected = true; 
    } 
} 

private void DeleteRow_Click(object sender, EventArgs e) 
{ 
    int rowToDelete = MyDataGridView.Rows.GetFirstRow(DataGridViewElementStates.Selected); 
    MyDataGridView.Rows.RemoveAt(rowToDelete); 
    MyDataGridView.ClearSelection(); 
} 
0

Tôi có một cách giải quyết mới kết quả tương tự, nhưng với ít mã hơn. cho Winforms ... Đó là ví dụ là trong portuguese Theo dõi từng bước

  1. Tạo ContextMenuStrip trong hình thức của bạn và tạo một mục
  2. Đăng một sự kiện nhấp chuột (OnCancelarItem_Click) cho việc này ContextMenuStrip enter image description here
  3. Tạo một sự kiện 'UserDeletingRow' trên GridView enter image description here và bây giờ ... bạn đã mô phỏng khi nhấn phím del từ người dùng

    bạn không quên bật xóa trên GridView, đúng không ?!

enter image description here enter image description here và cuối cùng ... enter image description here

Các vấn đề liên quan