首页 > 编程语言 >c# .net winfrom sunnyui的RichTextBox TextBox的KeyPress和KeyDown对Enter按钮无效处理

c# .net winfrom sunnyui的RichTextBox TextBox的KeyPress和KeyDown对Enter按钮无效处理

时间:2024-03-05 16:26:06浏览次数:12  
标签:Rows sunnyui ColumnIndex c# winfrom Cells richText RowIndex dgv

效果图:

 

在此之前感谢博主,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)
版权:本文版权归作者和博客园共有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任

标签:Rows,sunnyui,ColumnIndex,c#,winfrom,Cells,richText,RowIndex,dgv
From: https://www.cnblogs.com/bklsj/p/18054295

相关文章

  • Codeforces Round 930 (Div. 1)
    Preface虽然难得有Div1的CF,但由于在周四晚上学校要断电就没打这两天有空去补了下发现好像错过了最适合我的一场,AB都是一眼题,C是经典图论建模,D是DS典题没有Counting我直接爽飞,不过估计现场打的话写个ABC差不多了,D的码量还是挺大的A.BitwiseOperationWizard很有意思的一个......
  • IISExpress 跨域cookie的奇怪问题
    测试环境WIN10,IIS10,IISExpress10,Chrome120,MicrosoftEdge114网站A端口7001只有1个Default.aspx,无前端代码。逻辑很简单,SetCookie用来把客户端传过来的值写入到cookie中,GetCookie用来将客户端传过来的cookie值再返回给客户端。1protectedvoidPage_Load(objectsende......
  • QC3.0快充识别芯片FP6601Q:电子工程师的首选,兼容QC2.0与平芯微技术
    概述FP6601Q是一款智能充电管理芯片,具有出色的协议识别功能,可以自动识别接入的充电设备并调整输出电压,以满足不同设备的充电需求。它支持BC1.2、Apple、SamsungAFC、华为FCP/SCP、ClassA、QC3.0和QC2.0等多种充电协议,适用于苹果、三星、华为等多种品牌设备的快速充电。同时,它还......
  • .Net Core(七) 管道和中间件
    简介管道.NETCore中的管道是一个用于处理HTTP请求的组件。它是ASP.NETCore应用程序的核心部分,负责将传入的HTTP请求传递给适当的处理程序并生成响应。管道由一系列中间件组成,每个中间件都可以对请求或响应进行操作,然后将其传递给下一个中间件或终止请求处理。中间件......
  • 如何在MinGW GCC中查询Windows服务的状态?启动、停止 Windows 服务 Demo
    使用MinGWGCC完成查询Windows服务的状态:#include<windows.h>#include<stdio.h>//查询服务状态的函数voidQueryServiceStatus(constchar*serviceName){SC_HANDLEscm,service;SERVICE_STATUSstatus;//打开服务控制管理器scm=OpenSCMana......
  • 572. 另一棵树的子树c
    /***Definitionforabinarytreenode.*structTreeNode{*intval;*structTreeNode*left;*structTreeNode*right;*};*/boolissameroot(structTreeNode*p,structTreeNode*q){if(!p&&!q)returntrue;if(!q&......
  • 合并Excel文件
    合并Excel文件需求:把多个Excel文件合并到一个Excel文件的不同表格中。且需要合并的文件前后缀一致。对合并完成的文件中每张表指定列找出最大值标红XXX表示需要自己填写的内容importosimportpandasaspdfromopenpyxlimportload_workbookfromopenpyxl.stylesi......
  • winfrom控制相机拍照
    usingSystem;usingSystem.Runtime.InteropServices;//publicdelegatevoidSaveImg(PickPick1);///<summary>///一个控制摄像头的类///</summary>publicclassCameraManager{privateconstintWM_USER=0x400;privateconstintWS_CHILD=0......
  • C# WinForm基于owin创建WebApi
    在实际的项目开发中,可能会有在WinForm程序中提供Web服务器的需求。通过owin可以很方便的实现,并且可提供Web静态文件访问服务。操作方法:1.在NuGet引用owinMicrosoft.AspNet.WebApi.OwinMicrosoft.AspNet.WebApi.OwinSelfHostMicrosoft.Owin.StaticFiles2.添加服务启动配置类 ......
  • IDEA 配置 Tomcat
    IDEA配置Tomcat.mdIDEA配置Tomcat最快的方法:使用Maven下面介绍其他方法:以下使用IDEA20231、新建项目2、添加WebApplication这一步很关键:有的IDEA版本是可以在创建项目时勾选框架的。。此处不再展开介绍对于IDEA2023:先找到添加框架支持的工具栏!!!记得点到项目模块那一栏,只......