हालांकि यह प्रश्न पुराना है, उत्तर उचित नहीं हैं। प्रसंग मेनू के DataGridView पर अपने स्वयं के कार्यक्रम हैं। पंक्ति संदर्भ मेनू और सेल संदर्भ मेनू के लिए एक घटना है।
जिस कारण से ये उत्तर उचित नहीं हैं, वे विभिन्न ऑपरेशन योजनाओं के लिए जिम्मेदार नहीं हैं। एक्सेसिबिलिटी विकल्प, रिमोट कनेक्शन या मेट्रो / मोनो / वेब / डब्ल्यूपीएफ पोर्टिंग काम नहीं कर सकती है और कीबोर्ड शॉर्टकट राइट फेल (शिफ्ट + एफ 10 या कॉन्टेक्स्ट मेन्यू की) नीचे आ जाएंगे।
सही माउस क्लिक पर सेल चयन मैन्युअल रूप से नियंत्रित किया जाना है। संदर्भ मेनू को दिखाने की आवश्यकता नहीं है क्योंकि यह UI द्वारा नियंत्रित किया जाता है।
यह Microsoft Excel द्वारा उपयोग किए गए दृष्टिकोण की पूरी तरह से नकल करता है। यदि कोई सेल चयनित श्रेणी का हिस्सा है, तो सेल चयन नहीं बदलता है और न ही करता है CurrentCell
। यदि ऐसा नहीं है, तो पुरानी सीमा को हटा दिया जाता है और सेल का चयन कर लिया जाता है CurrentCell
।
यदि आप इस पर अस्पष्ट हैं, CurrentCell
तो तीर कुंजियों को दबाते समय कीबोर्ड पर ध्यान केंद्रित किया गया है। Selected
क्या यह इसका हिस्सा है SelectedCells
। संदर्भ मेनू यूआई द्वारा नियंत्रित के रूप में राइट क्लिक पर दिखाई देगा।
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;
}
}
}
कीबोर्ड शॉर्टकट डिफ़ॉल्ट रूप से संदर्भ मेनू नहीं दिखाते हैं, इसलिए हमें उन्हें जोड़ना होगा।
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);
}
}
}
}
मैंने इस कोड को सांख्यिकीय रूप से काम करने के लिए फिर से काम किया है, इसलिए आप उन्हें किसी भी घटना में कॉपी और पेस्ट कर सकते हैं।
कुंजी का उपयोग करना है CellContextMenuStripNeeded
क्योंकि यह आपको संदर्भ मेनू देगा।
यहां एक उदाहरण दिया गया है CellContextMenuStripNeeded
जहां आप यह निर्दिष्ट कर सकते हैं कि यदि आप प्रति पंक्ति अलग-अलग होना चाहते हैं तो कौन सा संदर्भ मेनू दिखा सकते हैं।
इस संदर्भ में MultiSelect
है True
और SelectionMode
है FullRowSelect
। यह सिर्फ उदाहरण के लिए है न कि एक सीमा के लिए।
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
}
}
}