DataGridView回车换行

来源:互联网 发布:jenkins 配置mac节点 编辑:程序博客网 时间:2024/05/31 18:52

               在DataGridView单元格中输入文本时,希望能够输入多行,但找了很多资料都没有找到方法,多行显示可以,但输入的时候要回车换行就做不到。后来找了个变通的办法:要换行,就输入个回车 ,弹出个对话框,在对话框里输入文本,然后确定,输入的内容,加到单元格中。麻烦点,但也是个办法吧,贴出来,如果有高人有更好的办法,望指教。

        下面是带DataGridView的页面

       

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. namespace DataGridViewEnterDemo
  9. {
  10.     public partial class frm_YaoPin_In : Form
  11.     {
  12.         private DataTable m_table;
  13.         private bool enterkey ;
  14.         /// <summary>
  15.         /// 获取数据源,这里不从数据库检索,只初始化一个 DataSet来作为数据源
  16.         /// </summary>
  17.         private void getDataSouse()
  18.         {
  19.             if (m_table == null)
  20.             {
  21.                 m_table = new DataTable();
  22.                 m_table.Columns.Add("产品代号", Type.GetType("System.String"));
  23.                 m_table.Columns.Add("产品名称", Type.GetType("System.String"));
  24.                 m_table.Columns.Add("规格", Type.GetType("System.String"));
  25.                 m_table.Columns.Add("剂型", Type.GetType("System.String"));
  26.                 m_table.Columns.Add("批号", Type.GetType("System.String"));
  27.                 m_table.Columns.Add("包装规格", Type.GetType("System.String"));
  28.                 m_table.Columns.Add("单位", Type.GetType("System.String"));
  29.                 m_table.Columns.Add("数量", Type.GetType("System.Double"));
  30.                 m_table.Columns.Add("检验单号", Type.GetType("System.String"));
  31.                 m_table.Columns.Add("生产厂家", Type.GetType("System.String"));
  32.                 for (int i = 0; i < 10; i++)
  33.                 {
  34.                     DataRow dr = m_table.NewRow();  //添加新行
  35.                     dr["产品代号"] = "";
  36.                     dr["产品名称"] = "";
  37.                     dr["规格"] = "";
  38.                     dr["剂型"] = "";
  39.                     dr["批号"] = "";
  40.                     dr["包装规格"] = "";
  41.                     dr["单位"] = "";
  42.                     dr["数量"] = 0;
  43.                     dr["检验单号"] = "";
  44.                     dr["生产厂家"] = "";
  45.                     m_table.Rows.Add(dr);
  46.                 }
  47.             }
  48.             
  49.         }
  50.         public frm_YaoPin_In()
  51.         {
  52.             InitializeComponent();
  53.            
  54.         }
  55.         private void YaoPin_In_Load(object sender, EventArgs e)
  56.         {
  57.             this.getDataSouse();
  58.             this.dataGridView1.DataSource = m_table;
  59.             this.dataGridView1.DefaultCellStyle.WrapMode = DataGridViewTriState.True;     //设置为自动换行
  60.             this.dataGridView1.Columns["产品代号"].Width = 80;
  61.             this.dataGridView1.Columns["产品名称"].Width = 180;
  62.             this.dataGridView1.Columns["规格"].Width = 60;
  63.             this.dataGridView1.Columns["剂型"].Width = 55;
  64.             this.dataGridView1.Columns["批号"].Width = 60;
  65.             this.dataGridView1.Columns["包装规格"].Width = 60;
  66.             this.dataGridView1.Columns["单位"].Width = 30;
  67.             this.dataGridView1.Columns["数量"].Width = 60;
  68.             this.dataGridView1.Columns["检验单号"].Width = 80;
  69.             this.dataGridView1.Columns["生产厂家"].Width = 80;
  70.           
  71.         }
  72.         protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
  73.         {
  74.             enterkey =false;
  75.             if (keyData == Keys.Enter )    //监听回车事件
  76.             {
  77.               
  78.                 if (this.dataGridView1.IsCurrentCellInEditMode)   //如果当前单元格处于编辑模式
  79.                 {
  80.                     enterkey = true;    //把是否点击按钮设置为真
  81.                     if (this.dataGridView1.CurrentCell.ColumnIndex < this.dataGridView1.ColumnCount-1)   //光标移动到右边列
  82.                     {
  83.                         this.dataGridView1.CurrentCell = this.dataGridView1[this.dataGridView1.CurrentCell.ColumnIndex + 1, this.dataGridView1.CurrentCell.RowIndex];
  84.                     }
  85.                 }
  86.             }
  87.             //继续原来base.ProcessCmdKey中的处理
  88.             return base.ProcessCmdKey(ref msg, keyData);
  89.         }
  90.         private void dataGridView1_CellParsing(object sender, DataGridViewCellParsingEventArgs e)
  91.         {
  92.             if (enterkey)  //判断是否按回车
  93.             {
  94.                 DataGridView dgv = (DataGridView)sender;
  95.                 DataGridEnter select = new DataGridEnter(e);   //把DataGridViewCellParsingEventArgs的参数传递进去,在打开对话框中修改e.Value。单元格的值
  96.                 select.ShowDialog();                   //重新打开一个窗口用于输入文本。
  97.                 e.ParsingApplied = true;
  98.             }
  99.         }
  100.     }
  101. }

文中主要用到两个事件,一个是重写窗体的ProcessCmdKey事件,来捕捉回车按钮,

一个是DataGridView的CellParing事件,当用户离开编辑模式。按回车和Tab会触发。

思路就是:在ProcessCmdKey中捕捉回车,把是否回车标示enterkey改为True。在CellParsing事件中打开窗体,改变单元格的值。

打开窗体的代码如下所示:

  

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. namespace DataGridViewEnterDemo
  9. {
  10.     public partial class DataGridEnter : Form
  11.     {
  12.         public DataGridEnter()
  13.         {
  14.             InitializeComponent();
  15.         }
  16.         private System.Windows.Forms.DataGridViewCellParsingEventArgs   m_event;
  17.         public DataGridEnter(System.Windows.Forms.DataGridViewCellParsingEventArgs e)
  18.         {
  19.             this.m_event  = e;
  20.             this.InitializeComponent();
  21.           
  22.         }
  23.         private void btnOK_Click(object sender, EventArgs e)
  24.         {
  25.             this.m_event.Value = this.tbxdatagridcurrentvalue.Text;
  26.             this.Close();
  27.         }
  28.         private void DataGridEnter_Load(object sender, EventArgs e)
  29.         {
  30.             this.tbxdatagridcurrentvalue.Text = this.m_event.Value.ToString();
  31.         }
  32.     }
  33. }

 

 

在其中加入一个可以输入多行的文本框,和一个按钮,把cellparing事件中的参数DataGridViewCellParsingEventArgs 传递进来,

在点击确定的时候改变DataGridViewCellParsingEventArgs 的值。达到改变输入单元格值得效果。

 

       在开始解决这个问题的时候,我试图在事件  ProcessCmdKey中按回车后在当前单元格中加入"/r/n"来达到回车效果,但却怎么也不能取到当前单元格值,也不能设置当前单元格值,设置旁边的单元格都可以。想了很多办法都是失败。

     后来又在dataGridView1_CellParsing事件中做,可以读取和改写单元格值,但又没有办法让焦点回到单元格中,后来还是失败。也不知道有没有好的解决方法!

原创粉丝点击