none
DataGridView如何复制单元格的实际值. RRS feed

  • 问题

  • 我使用Clipboard.SetDataObject复制DataGridView选中的单元格时,发现复制的是所显示的值(我对某些单元格在CellFormatting事件里写了格式化)。能否复制其实际的值呢?

    陈锦巍

    2012年2月25日 4:35

答案

  • 恐怕你必须从数据源中拷贝原数据,否则经过格式化数据无法进行更改。建议如下:


    namespace CSharp
    {
        public partial class Form1 : Form
        {
            ContextMenuStrip cs = null;
            DataTable dt = null;
            int rowindex = 0;
    
            public Form1()
            {
                InitializeComponent();
    
                //动态创建DataGridView并且绑定虚拟数据
                DataGridView dv = new DataGridView { Parent = this, Dock = DockStyle.Fill };
                dt = new DataTable();
                dt.Columns.Add("Money", typeof(double));
    
                Random r = new Random(Guid.NewGuid().GetHashCode());
    
                for (int i = 1; i < 6; i++)
                {
                    dt.Rows.Add(r.NextDouble() * 1000 + 9000);
                }
                //绑定CellFormatting事件,以便格式化数据
                dv.CellFormatting += new DataGridViewCellFormattingEventHandler(dv_CellFormatting);
                dv.DataSource = dt;
    
                //动态创建上下文菜单,以便复制原来DataTable真实内容
                cs = new ContextMenuStrip();
    
                //添加一个复制项
                ToolStripMenuItem menu = new ToolStripMenuItem("拷贝&C");
                menu.Click += new EventHandler(menu_Click);
                cs.Items.Add(menu);
                //弹出菜单
                dv.RowContextMenuStripNeeded += new DataGridViewRowContextMenuStripNeededEventHandler(dv_RowContextMenuStripNeeded);
            }
    
            void menu_Click(object sender, EventArgs e)
            {
                //复制第一列数据
                Clipboard.SetText(dt.Rows[rowindex][0].ToString());
            }
    
            void dv_RowContextMenuStripNeeded(object sender, DataGridViewRowContextMenuStripNeededEventArgs e)
            {
                e.ContextMenuStrip = cs;
                rowindex = e.RowIndex;
            }
    
            void dv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
            {
                if (e.ColumnIndex == 0)
                {
                    e.Value = string.Format("{0:#####,00}", e.Value);
                }
            }
        }
    }

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年2月26日 2:03
    版主

全部回复

  • 恐怕你必须从数据源中拷贝原数据,否则经过格式化数据无法进行更改。建议如下:


    namespace CSharp
    {
        public partial class Form1 : Form
        {
            ContextMenuStrip cs = null;
            DataTable dt = null;
            int rowindex = 0;
    
            public Form1()
            {
                InitializeComponent();
    
                //动态创建DataGridView并且绑定虚拟数据
                DataGridView dv = new DataGridView { Parent = this, Dock = DockStyle.Fill };
                dt = new DataTable();
                dt.Columns.Add("Money", typeof(double));
    
                Random r = new Random(Guid.NewGuid().GetHashCode());
    
                for (int i = 1; i < 6; i++)
                {
                    dt.Rows.Add(r.NextDouble() * 1000 + 9000);
                }
                //绑定CellFormatting事件,以便格式化数据
                dv.CellFormatting += new DataGridViewCellFormattingEventHandler(dv_CellFormatting);
                dv.DataSource = dt;
    
                //动态创建上下文菜单,以便复制原来DataTable真实内容
                cs = new ContextMenuStrip();
    
                //添加一个复制项
                ToolStripMenuItem menu = new ToolStripMenuItem("拷贝&C");
                menu.Click += new EventHandler(menu_Click);
                cs.Items.Add(menu);
                //弹出菜单
                dv.RowContextMenuStripNeeded += new DataGridViewRowContextMenuStripNeededEventHandler(dv_RowContextMenuStripNeeded);
            }
    
            void menu_Click(object sender, EventArgs e)
            {
                //复制第一列数据
                Clipboard.SetText(dt.Rows[rowindex][0].ToString());
            }
    
            void dv_RowContextMenuStripNeeded(object sender, DataGridViewRowContextMenuStripNeededEventArgs e)
            {
                e.ContextMenuStrip = cs;
                rowindex = e.RowIndex;
            }
    
            void dv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
            {
                if (e.ColumnIndex == 0)
                {
                    e.Value = string.Format("{0:#####,00}", e.Value);
                }
            }
        }
    }

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年2月26日 2:03
    版主
  • 哦,还以为DataGridView有什么属性可以设置为取实际值呢。看来只好读取绑定的数据源了,谢谢您的答复!


    陈锦巍

    2012年2月26日 3:45
  • 哦,还以为DataGridView有什么属性可以设置为取实际值呢。看来只好读取绑定的数据源了,谢谢您的答复!


    陈锦巍

    就我知道而言是如此,要不你可以再等等看,先用我的方案再说。

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年2月26日 4:02
    版主
  • 哦,还以为DataGridView有什么属性可以设置为取实际值呢。看来只好读取绑定的数据源了,谢谢您的答复!


    陈锦巍

    就我知道而言是如此,要不你可以再等等看,先用我的方案再说。

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处


    好就先这么用吧,大概没有那么方便的办法。谢谢了!

    陈锦巍

    2012年2月27日 1:11