এই প্রশ্নটি পুরানো হলেও উত্তরগুলি সঠিক নয়। প্রসঙ্গ মেনুগুলির ডেটাগ্রিডভিউতে তাদের নিজস্ব ইভেন্ট রয়েছে। সারি প্রসঙ্গ মেনু এবং সেল প্রসঙ্গ মেনুয়ের জন্য একটি ইভেন্ট রয়েছে।
যে কারণে এই উত্তরগুলি যথাযথ নয় সেগুলি হ'ল তারা বিভিন্ন অপারেশন প্রকল্পের জন্য অ্যাকাউন্ট করে না। অ্যাক্সেসযোগ্যতার বিকল্পগুলি, রিমোট সংযোগগুলি বা মেট্রো / মনো / ওয়েব / ডাব্লুপিএফ পোর্টিং কাজ না করতে পারে এবং কীবোর্ড শর্টকাটগুলি ডানদিকে ব্যর্থ হয়ে যাবে (শিফট + এফ 10 বা প্রসঙ্গ মেনু কী)।
ডান মাউস ক্লিকে ঘর নির্বাচন ম্যানুয়ালি পরিচালনা করতে হবে। প্রসঙ্গ মেনুটি দেখানো হ্যান্ডেল করার দরকার নেই কারণ এটি ইউআই দ্বারা পরিচালিত হয়।
এটি মাইক্রোসফ্ট এক্সেল দ্বারা ব্যবহৃত পদ্ধতির সম্পূর্ণ নকল করে। যদি ঘরটি একটি নির্বাচিত ব্যাপ্তির অংশ হয় তবে ঘর নির্বাচন পরিবর্তন হয় না এবং হয় না 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);
}
}
}
}
আমি এই কোডটি স্থিতিশীলভাবে কাজ করতে পুনরায় কাজ করেছি, যাতে আপনি এটিকে কোনও ইভেন্টে অনুলিপি করে আটকান can
কীটি ব্যবহার করা হ'ল এটি 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
}
}
}