效果图:
在此之前感谢博主,winform无法屏蔽回车事件、KeyPress事件不执行问题解决-CSDN博客
根据该大佬的方式,需处理添加回车事件处理,便继承了RichTextBox重写该方法,且执行了执行事件
public sealed class MyUIRichTextBox : UIRichTextBox { public bool LastRow=false; public event KeyEventHandler MyEnterEvent; protected override bool ProcessDialogKey(Keys keyData) { //处理回车键 if (keyData == Keys.Enter && LastRow) { MyEnterEvent?.Invoke(this,new KeyEventArgs(keyData)); return true; } return base.ProcessDialogKey(keyData); } }下面是实现的结果,实现自动对每行超过文本框的内容展示RichBox悬浮展示,且添加允许修改的列和回车保存
public class UIDataGridView : DataGridView, IStyleInterface { MyUIRichTextBox richText = new MyUIRichTextBox(); Rectangle _Rectangle; public UIDataGridView() { richText.MyEnterEvent += RichText_KeyDown;//这个事件是因为表格的最后一行得手动处理提交到Cell的Value richText.Parent = this; richText.Visible = false; richText.TabStop = false; richText.Font = this.Font; this.CellEnter += new System.Windows.Forms.DataGridViewCellEventHandler(this.dgv_CellClick); this.CellLeave += new DataGridViewCellEventHandler(this.dgv_CellLeave); this.CellValidating += new System.Windows.Forms.DataGridViewCellValidatingEventHandler(this.dgv_CellValidating); } private void RichText_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter && richText.LastRow) { dgv_CellLeave(null, null); } } List<string> ColumnsNameNotRich = null; /// <summary> /// 无论任何情况该列都不显示RichTextBox /// </summary> /// <param name="columns">列名</param> public void SetNotRich(string[] columns) { ColumnsNameNotRich = columns.ToList(); } /// <summary> /// 可修改的多行文本框richText,richText默认是只读 /// </summary> List<string> ColumnsNameMustRich = null; public void MustRich(string[] columns) { ColumnsNameMustRich = columns.ToList(); } private void dgv_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) { if (e.RowIndex < 0 || e.ColumnIndex < 0) { return; } DataGridView _dgv = this; if (_dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].OwningColumn.ReadOnly) { return; } Type _type = _dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].ValueType; if (_type == typeof(string)) { return; } object o = _dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].EditedFormattedValue; if (o == null || string.IsNullOrEmpty(o.ToString())) { return; } bool isError = false; DataGridViewColumn column = _dgv.Columns[e.ColumnIndex]; if (_type == typeof(double) || _type == typeof(decimal) || _type == typeof(float)) { decimal testD = 0; if (decimal.TryParse(o.ToString(), out testD) == false) { isError = true; } if (isError) { if (column is DataGridViewTextBoxColumn) { Sunny.UI.Common.ShowErrorTip("请输入正确的数值" + column.HeaderText); e.Cancel = true; } } } else if (_type == typeof(int)) { int testD2 = 0; if (int.TryParse(o.ToString(), out testD2) == false) { isError = true; } if (isError) { if (column is DataGridViewTextBoxColumn) { Sunny.UI.Common.ShowErrorTip("请输入正确的数值" + column.HeaderText + ",输入整数!"); e.Cancel = true; } } } } DgvFilterManager filterManager = null; private void dgv_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) { if (filterManager == null) { filterManager = new DgvFilterManager(this); //开启万能查询 } //if (this.InvokeRequired) //{ // this.Invoke(new Action(() => // { // richText.Font = this.Font; // })); //} //else //{ // richText.Font = this.Font; //} //new GUTAERP.UserControls.DataGridViewColumnSelector(this); } private void dgv_CellLeave(object sender, EventArgs e) { if (!richText.ReadOnly && richText.Tag != null) { DataGridViewCell cell = (DataGridViewCell)richText.Tag; cell.Value = richText.Text; } if (richText.Visible) { richClear(); } } private void richClear() { richText.LastRow = false; richText.Visible = false; richText.Text = ""; richText.Tag = null; } private void dgv_CellClick(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex < 0 || e.ColumnIndex < 0) { return; } DataGridView _dgv = this; if (_dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Value == null) { return; } if (richText.Visible) { richClear(); return; } if (ColumnsNameNotRich != null) { int i = ColumnsNameNotRich.Count(a => a == _dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].OwningColumn.Name); if (i > 0) { return; } } bool mustShow = false; if (ColumnsNameMustRich != null) { int i = ColumnsNameMustRich.Count(a => a == _dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].OwningColumn.Name); if (i > 0) { mustShow = true; } } if (!_dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].OwningColumn.ReadOnly && !mustShow) { return; } string str = _dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString(); int _width = TextRenderer.MeasureText(str, this.Font).Width; _width = str.IndexOf("\n") != -1 ? Screen.PrimaryScreen.WorkingArea.Width : _width; if (_width > _dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].OwningColumn.Width || mustShow) { _Rectangle = _dgv.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true); //得到所在单元格位置和大小 richText.Text = _dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString(); richText.Size = new Size(_dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Size.Width, 200); //把单元格大小赋给控件 AutoSizeControl(richText); richText.Location = new Point(_Rectangle.X, _Rectangle.Y + _dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Size.Height); //把单元格位置赋给控件 richText.Visible = true; //可以显示控件了 richText.BringToFront(); //richText.Focus(); if (!mustShow) { richText.ReadOnly = true; } else { richText.ReadOnly = false; if (_dgv.RowCount - 1 == e.RowIndex) { richText.LastRow = true; } richText.Focus(); //光标定位最后 richText.Select(richText.TextLength, 0); //滚动到控件光标处 richText.ScrollToCaret(); } richText.Tag = _dgv.Rows[e.RowIndex].Cells[e.ColumnIndex]; } else { richClear(); } } private void AutoSizeControl(Control co) { Graphics g = co.CreateGraphics(); SizeF sif = new SizeF(co.Size.Width, 650);//最大高度 Size preSize = g.MeasureString(co.Text, co.Font, sif).ToSize(); if (preSize.Width < co.Width) { preSize.Width = co.Width; } if (preSize.Height < co.Height) { preSize.Height = co.Height; } co.Size = preSize; g.Dispose(); } }
作者:兮去博客
出处:c# .net winfrom sunnyui的RichTextBox TextBox的KeyPress和KeyDown对Enter按钮无效处理 - 兮去 - 博客园 (cnblogs.com)
版权:本文版权归作者和博客园共有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任