【问题标题】:MultipleSelect DataGridView c#多选DataGridView c#
【发布时间】:2020-05-10 17:39:23
【问题描述】:

我似乎有一些类似的问题,但不完全是这样。我试图在只有一列和多行的 DataGridView 中进行多项选择。我希望能够通过正常单击(不按 Ctrl)进行选择和取消选择,并且选择一直保持到我再次单击为止。我得到了

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {

            InitializeComponent();

            dataGridView1.Rows.Add();
            dataGridView1.Rows.Add();
            dataGridView1.Rows.Add();

        }

        DataGridView1.MultipleSelect = true;
        DataGridView1.SelectMode = GridViewSelectMode.SelectCells;

    private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
    {
        //handle the keep select/unselect group
    }

但是如何设置不使用Ctrl键保持选择的条件?谢谢

【问题讨论】:

  • 当您不想将单元格添加到选择组中而只是将选择项移动到另一个单元格时会发生什么?
  • 您需要单击以取消选择不需要的单元格。然后再次单击您希望再次出现在选择组中的每个单元格。
  • 那没有回答我问的问题。
  • 那我想我不明白你的问题。如果要将选择移动到另一个单元格。您必须取消选择不需要的单元格,然后选择想要的单元格。对不起,我不明白这个问题。
  • 你能改写它吗?

标签: c# datagridview selection


【解决方案1】:

您可以通过稍微调整网格的配色方案来自己选择单元格,并在单击它们时将它们存储/从列表中删除:

    public partial class Form1 : Form
    {
        /// <summary>
        /// Currently selected cells.
        /// </summary>
        private List<DataGridViewCell> _selectedCells = new List<DataGridViewCell>();

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            /* Just for test
            dataGridView1.Columns.Add("A", "ColA");
            dataGridView1.Columns.Add("B", "ColB");
            dataGridView1.Columns.Add("C", "ColC");
            dataGridView1.Columns.Add("D", "ColD");

            dataGridView1.Rows.Add("A1","B1","C1","D1");
            dataGridView1.Rows.Add("A2", "B2", "C2", "D2");
            dataGridView1.Rows.Add("A3", "B3", "C3", "D3");
            dataGridView1.Rows.Add("A4", "B4", "C4", "D4");
            dataGridView1.Rows.Add("A5", "B5", "C5", "D5");
            dataGridView1.Rows.Add("A6", "B6", "C6", "D6");
            */

            dataGridView1.MultiSelect = false;
            dataGridView1.SelectionMode = DataGridViewSelectionMode.CellSelect;
            dataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically;
        }

        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            // Edited and added this line to avoid problems when clicking on the header.
            if (e.RowIndex < 0 || e.ColumnIndex < 0) return;
            // Clears all the selected cells.
            dataGridView1.ClearSelection();

            if (_selectedCells.Contains(dataGridView1[e.ColumnIndex, e.RowIndex]))
            {
                _selectedCells.Remove(dataGridView1[e.ColumnIndex, e.RowIndex]);
                dataGridView1[e.ColumnIndex, e.RowIndex].Style.BackColor = dataGridView1.DefaultCellStyle.BackColor;
            }
            else
            {
                _selectedCells.Add(dataGridView1[e.ColumnIndex, e.RowIndex]);
                dataGridView1[e.ColumnIndex, e.RowIndex].Style.BackColor = dataGridView1.DefaultCellStyle.SelectionBackColor;
            }
        }

        private void dataGridView1_SelectionChanged(object sender, EventArgs e)
        {
            dataGridView1.ClearSelection();
        }

        private void dataGridView1_DoubleClick(object sender, EventArgs e)
        {
            dataGridView1.BeginEdit(true);
        }
    }

【讨论】:

  • 非常感谢,就像一个魅力。这完美地完成了这个把戏。很有创意!
  • @JuanJesus 不客气。请注意,我在 CellClick 处理程序的开头编辑并添加了一个新行,以管理对标题的单击。
猜你喜欢
  • 1970-01-01
  • 2016-04-11
  • 1970-01-01
  • 1970-01-01
  • 2012-07-20
  • 1970-01-01
  • 1970-01-01
  • 2014-12-06
  • 1970-01-01
相关资源
最近更新 更多