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 ... 포르투갈어로 된 예입니다.
'IT TIP' 카테고리의 다른 글
실험적 구문 'classProperties'에 대한 지원이 현재 활성화되어 있지 않습니다. (0) | 2020.12.06 |
---|---|
.NET의`Array.Sort ()`메서드에서 사용하는 정렬 알고리즘이 안정적인 알고리즘입니까? (0) | 2020.12.06 |
! = 및! ==와 같지 않은 PHP (0) | 2020.12.06 |
로컬 서버에 이미지 쓰기 (0) | 2020.12.06 |
테이블 값 함수 실행 방법 (0) | 2020.12.06 |