c# - माउस क्लिक पर बहु ​​चयन बनाए रखें और आगे की कार्यक्षमताएं करें




.net winforms (2)

नमस्ते मैं सी # में एक आवेदन कर रहा हूँ

मैं क्या हासिल करने की कोशिश कर रहा हूं

  • मैं DataGridView में परिणामों के बीच CTRL के साथ एकाधिक पंक्तियों का चयन करता हूं
  • तो मैं उस पर सही क्लिक करता हूं और यह विकल्प दिखाता है
  • मैं चयनित विकल्प चुनने पर क्लिक करता हूं
  • चुनी गई पंक्तियों को डेटाग्रीड दृश्य पर रखा जाता है और अन्य पंक्तियों को निकाल दिया जाता है

समस्या जहां मैं अटक गया

  • मैं CTRL के साथ एकाधिक पंक्तियों का चयन करता हूँ
  • लेकिन जब मैं पंक्तियों पर राइट क्लिक करता हूं तो एकाधिक चयन गायब हो जाता है

नोट: मैं पंक्तियों पर दायाँ क्लिक करने के लिए MouseClick ईवेंट का उपयोग कर रहा हूं और एक मेनू जेनरेट करता हूं इस घटना का कोड नीचे दिया गया है:

private void SearchPanelDataGridView_MouseClick(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
        ContextMenuStrip smenu = new System.Windows.Forms.ContextMenuStrip();
        var htest = SearchPanelDataGridView.HitTest(e.X, e.Y);
        SearchPanelDataGridView.ClearSelection();
        SearchPanelDataGridView.Rows[htest.RowIndex].Selected = true;

        smenu.Items.Add("Clear Record").Name = "Clear Record";
        smenu.Items.Add("Pay Amount").Name = "Pay Amount";
        smenu.Items.Add("Break Apart").Name = "Break Apart";
        smenu.Items.Add("View Details").Name = "View Details";
        smenu.Items.Add("Choose Selected").Name = "Choose Selected"; // Choose Rows Option
        smenu.Items.Add("Reset").Name = "Reset";

        int CurrentMouseOverRow = SearchPanelDataGridView.HitTest(e.X, e.Y).RowIndex;
        smenu.Show(SearchPanelDataGridView, new Point(e.X, e.Y));
        smenu.ItemClicked += new ToolStripItemClickedEventHandler(smenu_ItemClicked);
    }
}

आपको MouseClick ईवेंट को नियंत्रित करने की आवश्यकता नहीं है डिजाइनर का इस्तेमाल करते हुए या प्रपत्र के लोड होने पर ContextmenuStrip । फिर संदर्भ मेनू पट्टी को DataGridView की प्रॉपर्टी ContextMenuStrip को असाइन करें, फिर ToolStripMenuItem Click ईवेंट को संभाल लें जो गैर-चयनित पंक्तियों को निकालना चाहिए और इस तरह के कोड का उपयोग करें:

dataGridView1.Rows.Cast<DataGridViewRow>()
    .Where(x => !dataGridView1.SelectedRows.Contains(x) && !x.IsNewRow)
    .ToList().ForEach(x => dataGridView1.Rows.Remove(x));

इस तरह, सभी गैर-चयनित पंक्तियों को निकाल दिया जाएगा और चयन अछूता रहेगा।


यह सबसे अच्छा समाधान नहीं हो सकता है, लेकिन अब आप यह कोशिश कर सकते हैं:

    List<int> selectedRowsIndexes = new List<int>();
    private void dataGridView1_Click(object sender, EventArgs e)
    {
        selectedRowsIndexes.Clear();
        foreach (DataGridViewRow row in dataGridView1.SelectedRows)
           selectedRowsIndexes.Add(row.Index);
    }

    private void dataGridView1_MouseClick(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            ContextMenuStrip smenu = new System.Windows.Forms.ContextMenuStrip();
            var htest = dataGridView1.HitTest(e.X, e.Y);
            dataGridView1.ClearSelection();
            dataGridView1.Rows[htest.RowIndex].Selected = true;

            smenu.Items.Add("Clear Record").Name = "Clear Record";
            smenu.Items.Add("Pay Amount").Name = "Pay Amount";
            smenu.Items.Add("Break Apart").Name = "Break Apart";
            smenu.Items.Add("View Details").Name = "View Details";
            smenu.Items.Add("Choose Selected").Name = "Choose Selected"; // Choose Rows Option
            smenu.Items.Add("Reset").Name = "Reset";

            int CurrentMouseOverRow = dataGridView1.HitTest(e.X, e.Y).RowIndex;
            smenu.Show(dataGridView1, new Point(e.X, e.Y));

            foreach (int rowIndex in selectedRowsIndexes)
            {
                for (int i = 0; i < dataGridView1.Rows.Count; i++)
                {
                   dataGridView1.Rows[i].Selected = (i == rowIndex);
                }
            }
        }
    }

यह काम करने के लिए, DataGridView की SelectionMode संपत्ति को FullRowSelect पर सेट किया जाना चाहिए





datagridview