IT TIP

Datagridview에서 행을 선택하려면 마우스 오른쪽 버튼을 클릭하고 삭제할 메뉴를 표시합니다.

itqueen 2020. 12. 6. 22:29
반응형

Datagridview에서 행을 선택하려면 마우스 오른쪽 버튼을 클릭하고 삭제할 메뉴를 표시합니다.


DataGridView에 열이 거의없고 행에 데이터가 있습니다. 여기에서 몇 가지 해결책을 보았지만 결합 할 수 없습니다!

단순히 행을 마우스 오른쪽 버튼으로 클릭하는 방법으로 전체 행을 선택하고 행을 삭제하는 옵션이있는 메뉴를 표시하며 옵션을 선택하면 행을 삭제합니다.

나는 몇 번 시도했지만 아무것도 작동하지 않고 지저분 해 보입니다. 어떻게해야합니까?


마침내 해결했습니다.

  • Visual Studio에서 "DeleteRow"라는 항목을 사용하여 ContextMenuStrip을 만듭니다.

  • 그런 다음 DataGridView 링크에서 ContextMenuStrip

아래 코드를 사용하면 작동하는 데 도움이되었습니다.

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

여기 멋진 부분이 있습니다

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();
}

이 질문을 완성하려면 마우스보다 Grid 이벤트를 사용하는 것이 좋습니다.

먼저 데이터 그리드 속성을 설정합니다.

SelectionMode에서 FullRowSelect로, RowTemplate / ContextMenuStrip에서 컨텍스트 메뉴로.

CellMouseDown 이벤트를 만듭니다.

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

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. 가장 쉬운 방법 기간. 사용자 지정 셀의 경우 약간만 수정하십시오.


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();
    }
}

이것은 더 쉽습니다. 당연히 이미 언급했듯이 mousedown-event를 초기화해야합니다.

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

생성자에서.


이 질문에 제시된 모든 답변은 마우스 클릭 이벤트를 기반으로합니다. 당신은 또한 당신 ContenxtMenuStrip에게 할당 DataGridview하고 사용자가 RightMouseButtons있을 때 선택된 행이 있는지 확인 DataGridView하고 당신이 볼 것인지 여부를 결정할 수 있습니다 ContenxtMenuStrip. Opening 이벤트CancelEventArgs.Cancel 에서 값 을 설정하면됩니다 .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;
    }

그러나 선택 항목에 따라 각기 다른 옵션이 포함 된 컨텍스트 메뉴 스트립이 여러 개있는 경우 마우스 클릭 방식으로 직접 이동합니다.


@ Data-Base 응답을 기반으로 선택 모드를 FullRow로 만들 때까지 작동하지 않습니다.

  MyDataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;

하지만 CellSelect 모드에서 작동하도록해야하는 경우

 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();
}

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();
}

이벤트 코드 내에서 다음을 사용하여이 작업을 좀 더 간단하게 만들 수도 있습니다.

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

여기에서 DataGridView RowTemplate속성을 사용하여 수행 할 수 있습니다 .

참고 :이 코드는 테스트되지 않았지만 이전에이 방법을 사용했습니다.

// 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;

그리고 그렇게 쉽게하실 수 있습니다!


동일한 결과를 얻을 수있는 새로운 해결 방법이 있지만 코드는 더 적습니다. for Winforms ... 포르투갈어로 된 예입니다.

  1. 양식에 contextMenuStrip을 만들고 하나의 항목을 만듭니다.
  2. 이 컨텍스트에 대해 하나의 이벤트 클릭 (OnCancelarItem_Click)에 서명합니다. enter image description here
  3. Create a event 'UserDeletingRow' on gridview enter image description here and now... you've simulating on key press del from user

    you don't forget to enable delete on the gridview, right?!

enter image description here enter image description here and finally... enter image description here

참고URL : https://stackoverflow.com/questions/3035144/right-click-to-select-a-row-in-a-datagridview-and-show-a-menu-to-delete-it

반응형