none
C# 设置datagridview控件按照ctrl然后双击鼠标快速修改多行数据 RRS feed

  • 问题

  • 我想实现在datagridview控件中,当我选中其中的某几行之后,我需要按住ctrl或者shift键然后双击鼠标左键。这时我选中行中我双击的那一行的某一个单元格变为可以编辑状态,但是我选中的其他几行变为灰色显示,当我修改完成这个单元格的数据之后不管是我按回车还是鼠标任意点击其他地方,这时我选中的这几行数据的同一列数据均变为我刚才修改的这个数据,请问这样的效果该如何实现?我百思不得其解!谢谢。
    2011年9月7日 6:57

答案

  • 你好!

    请参考我下面的示例及注释:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace X.DemoCenter.Winfroms
    {
        public partial class MainFrom : Form
        {
            public MainFrom()
            {
                InitializeComponent();
                InitializeUI();
            }
    
            DataTable dt;
            DataGridView gv;
    
            void InitializeUI()
            {
                // 操作提示
                // 选中:用鼠标拖选或 Ctrl + Shift 的方式进行多选
                // 修改:按住 Shift 不放双击某一单元格
                dt = new DataTable();
                dt.Columns.Add("Id", typeof(int));
                dt.Columns.Add("Amount", typeof(int));
    
                dt.Rows.Add(new object[] { 1, 10});
                dt.Rows.Add(new object[] { 2, 9 });
                dt.Rows.Add(new object[] { 3, 12 });
                dt.Rows.Add(new object[] { 4, 3 });
                dt.Rows.Add(new object[] { 5, 12 });
    
                gv = new DataGridView();
                gv.Dock = DockStyle.Fill;
                gv.MultiSelect = true;
                gv.DataSource = dt;
                gv.CellValueChanged += new DataGridViewCellEventHandler(gv_CellValueChanged);
    
                this.Controls.Add(gv);
            }
    
            void gv_CellValueChanged(object sender, DataGridViewCellEventArgs e)
            {
                var cell = gv[e.ColumnIndex, e.RowIndex];
    
                foreach (DataGridViewCell item in gv.SelectedCells)
                {
                    // 若不是同一列则不做修改
                    if (cell.ColumnIndex != item.ColumnIndex)
                        continue;
    
                    // 若是自己则不做修改
                    if (cell == item)
                        continue;
    
                    item.Value = cell.Value;
                }
            }
    
        }
    }
    
    


     


    知识改变命运,奋斗成就人生!
    2011年9月14日 8:24
    版主

全部回复

  • 1.最好重写grid,搞个同时响应鼠标和键盘操作的事件。

    2.或者折中一下,做到类似的效果。选择多行的情况下,在鼠标双击事件中检查键盘事件,如果有ctrl,双击的单元格变为可以编辑的。修改其他几个行为不可以编辑行。等待编辑完成(失去焦点||回车等)事件,将编辑好的内容赋值给其他的几个选择行。恢复其他行的可编辑属性(还有颜色等)。


    family as water
    2011年9月8日 1:16
  • 你好!

    请参考我下面的示例及注释:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace X.DemoCenter.Winfroms
    {
        public partial class MainFrom : Form
        {
            public MainFrom()
            {
                InitializeComponent();
                InitializeUI();
            }
    
            DataTable dt;
            DataGridView gv;
    
            void InitializeUI()
            {
                // 操作提示
                // 选中:用鼠标拖选或 Ctrl + Shift 的方式进行多选
                // 修改:按住 Shift 不放双击某一单元格
                dt = new DataTable();
                dt.Columns.Add("Id", typeof(int));
                dt.Columns.Add("Amount", typeof(int));
    
                dt.Rows.Add(new object[] { 1, 10});
                dt.Rows.Add(new object[] { 2, 9 });
                dt.Rows.Add(new object[] { 3, 12 });
                dt.Rows.Add(new object[] { 4, 3 });
                dt.Rows.Add(new object[] { 5, 12 });
    
                gv = new DataGridView();
                gv.Dock = DockStyle.Fill;
                gv.MultiSelect = true;
                gv.DataSource = dt;
                gv.CellValueChanged += new DataGridViewCellEventHandler(gv_CellValueChanged);
    
                this.Controls.Add(gv);
            }
    
            void gv_CellValueChanged(object sender, DataGridViewCellEventArgs e)
            {
                var cell = gv[e.ColumnIndex, e.RowIndex];
    
                foreach (DataGridViewCell item in gv.SelectedCells)
                {
                    // 若不是同一列则不做修改
                    if (cell.ColumnIndex != item.ColumnIndex)
                        continue;
    
                    // 若是自己则不做修改
                    if (cell == item)
                        continue;
    
                    item.Value = cell.Value;
                }
            }
    
        }
    }
    
    


     


    知识改变命运,奋斗成就人生!
    2011年9月14日 8:24
    版主