Bu soru eski olsa da cevaplar uygun değil. Bağlam menülerinin DataGridView üzerinde kendi olayları vardır. Satır bağlam menüsü ve hücre bağlam menüsü için bir olay var.
Bu cevapların uygun olmamasının nedeni, farklı işlem şemalarını hesaba katmamalarıdır. Erişilebilirlik seçenekleri, uzak bağlantılar veya Metro / Mono / Web / WPF bağlantı noktası çalışmayabilir ve klavye kısayolları aşağı doğru başarısız olur (Shift + F10 veya Bağlam Menüsü tuşu).
Sağ fare tıklamasıyla hücre seçimi manuel olarak yapılmalıdır. Bağlam menüsünün gösterilmesi, kullanıcı arabirimi tarafından işlendiği için işlenmesine gerek yoktur.
Bu, Microsoft Excel tarafından kullanılan yaklaşımı tamamen taklit eder. Hücre seçilen aralığın parçasıysa, hücre seçimi değişmez ve değişmez CurrentCell
. Değilse, eski aralık temizlenir ve hücre seçilir ve olur CurrentCell
.
Bu konuda net CurrentCell
değilseniz, ok tuşlarına bastığınızda klavyenin odaklandığı yerdir. Selected
parçası olup olmadığıdır SelectedCells
. Bağlam menüsü, kullanıcı arabirimi tarafından işlendiği şekliyle sağ tıklamada gösterilecektir.
private void dgvAccount_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.ColumnIndex != -1 && e.RowIndex != -1 && e.Button == System.Windows.Forms.MouseButtons.Right)
{
DataGridViewCell c = (sender as DataGridView)[e.ColumnIndex, e.RowIndex];
if (!c.Selected)
{
c.DataGridView.ClearSelection();
c.DataGridView.CurrentCell = c;
c.Selected = true;
}
}
}
Klavye kısayolları bağlam menüsünü varsayılan olarak göstermez, bu yüzden onları eklememiz gerekir.
private void dgvAccount_KeyDown(object sender, KeyEventArgs e)
{
if ((e.KeyCode == Keys.F10 && e.Shift) || e.KeyCode == Keys.Apps)
{
e.SuppressKeyPress = true;
DataGridViewCell currentCell = (sender as DataGridView).CurrentCell;
if (currentCell != null)
{
ContextMenuStrip cms = currentCell.ContextMenuStrip;
if (cms != null)
{
Rectangle r = currentCell.DataGridView.GetCellDisplayRectangle(currentCell.ColumnIndex, currentCell.RowIndex, false);
Point p = new Point(r.X + r.Width, r.Y + r.Height);
cms.Show(currentCell.DataGridView, p);
}
}
}
}
Bu kodu statik olarak çalışacak şekilde yeniden çalıştım, böylece bunları kopyalayıp herhangi bir etkinliğe yapıştırabilirsiniz.
Anahtar, CellContextMenuStripNeeded
size bağlam menüsünü vereceği için kullanmaktır .
CellContextMenuStripNeeded
Her satırda farklı menülerin olmasını istiyorsanız hangi bağlam menüsünün gösterileceğini belirleyebileceğiniz bir örnek aşağıda verilmiştir .
Bu bağlamda MultiSelect
olduğunu True
ve SelectionMode
bir FullRowSelect
. Bu sadece örnek içindir ve bir sınırlama değildir.
private void dgvAccount_CellContextMenuStripNeeded(object sender, DataGridViewCellContextMenuStripNeededEventArgs e)
{
DataGridView dgv = (DataGridView)sender;
if (e.RowIndex == -1 || e.ColumnIndex == -1)
return;
bool isPayment = true;
bool isCharge = true;
foreach (DataGridViewRow row in dgv.SelectedRows)
{
if ((string)row.Cells["P/C"].Value == "C")
isPayment = false;
else if ((string)row.Cells["P/C"].Value == "P")
isCharge = false;
}
if (isPayment)
e.ContextMenuStrip = cmsAccountPayment;
else if (isCharge)
e.ContextMenuStrip = cmsAccountCharge;
}
private void cmsAccountPayment_Opening(object sender, CancelEventArgs e)
{
int itemCount = dgvAccount.SelectedRows.Count;
string voidPaymentText = "&Void Payment"; // to be localized
if (itemCount > 1)
voidPaymentText = "&Void Payments"; // to be localized
if (tsmiVoidPayment.Text != voidPaymentText) // avoid possible flicker
tsmiVoidPayment.Text = voidPaymentText;
}
private void cmsAccountCharge_Opening(object sender, CancelEventArgs e)
{
int itemCount = dgvAccount.SelectedRows.Count;
string deleteChargeText = "&Delete Charge"; //to be localized
if (itemCount > 1)
deleteChargeText = "&Delete Charge"; //to be localized
if (tsmiDeleteCharge.Text != deleteChargeText) // avoid possible flicker
tsmiDeleteCharge.Text = deleteChargeText;
}
private void tsmiVoidPayment_Click(object sender, EventArgs e)
{
int paymentCount = dgvAccount.SelectedRows.Count;
if (paymentCount == 0)
return;
bool voidPayments = false;
string confirmText = "Are you sure you would like to void this payment?"; // to be localized
if (paymentCount > 1)
confirmText = "Are you sure you would like to void these payments?"; // to be localized
voidPayments = (MessageBox.Show(
confirmText,
"Confirm", // to be localized
MessageBoxButtons.YesNo,
MessageBoxIcon.Warning,
MessageBoxDefaultButton.Button2
) == DialogResult.Yes);
if (voidPayments)
{
// SQLTransaction Start
foreach (DataGridViewRow row in dgvAccount.SelectedRows)
{
//do Work
}
}
}
private void tsmiDeleteCharge_Click(object sender, EventArgs e)
{
int chargeCount = dgvAccount.SelectedRows.Count;
if (chargeCount == 0)
return;
bool deleteCharges = false;
string confirmText = "Are you sure you would like to delete this charge?"; // to be localized
if (chargeCount > 1)
confirmText = "Are you sure you would like to delete these charges?"; // to be localized
deleteCharges = (MessageBox.Show(
confirmText,
"Confirm", // to be localized
MessageBoxButtons.YesNo,
MessageBoxIcon.Warning,
MessageBoxDefaultButton.Button2
) == DialogResult.Yes);
if (deleteCharges)
{
// SQLTransaction Start
foreach (DataGridViewRow row in dgvAccount.SelectedRows)
{
//do Work
}
}
}