c# – Winforms:验证datagridview中的单元格的问题

c# – Winforms:验证datagridview中的单元格的问题,第1张

概述我想用CellValidating验证 Winforms datagridview单元格.如果用户未正确设置值,我设置ErrorText并使用e.Cancel,以便光标保留在单元格中. 现在的问题是,错误符号(和错误文本)没有显示(在单元格中).当我删除e.Cancel时,单元格会丢失焦点并显示错误符号.如何实现单元格保持编辑模式并显示错误符号? if (...){ this.datagr 我想用CellValIDating验证 Winforms datagrIDvIEw单元格.如果用户未正确设置值,我设置ErrorText并使用e.Cancel,以便光标保留在单元格中.
现在的问题是,错误符号(和错误文本)没有显示(在单元格中).当我删除e.Cancel时,单元格会丢失焦点并显示错误符号.如何实现单元格保持编辑模式并显示错误符号?
if (...){   this.datagrIDvIEwX.Rows[e.RowIndex].Cells[e.ColumnIndex].ErrorText = "Errortext";   e.Cancel = true;}else{   this.datagrIDvIEwX.Rows[e.RowIndex].Cells[e.ColumnIndex].ErrorText = "";}
解决方法 您看到的行为实际上是由于绘画问题而不是由于未显示错误图标.发生的事情是,当您设置单元格的错误文本时,会显示图标,但编辑模式下的单元格的文本框会显示在图标上,因此不会向用户显示图标!

你有两种方法可以解决这个问题 – 一种是简单地使用行的错误文本,而不是:

this.datagrIDvIEwX.Rows[e.RowIndex].Cells[e.ColumnIndex].ErrorText = "Errortext";  e.Cancel = true;

你有:

this.datagrIDvIEwX.Rows[e.RowIndex].ErrorText = "Errortext";e.Cancel = true;

另一个选项是更改单元格的单元格填充(移动编辑控件)并在其中绘制图标.

我实际上找到了解决问题here的技术,并在下面复制了他们的代码(在C#而不是VB.Net中).

首先,您有单元验证事件,您可以在其中添加一些代码来更改单元格填充:

voID dataGrIDVIEw1_CellValIDating(object sender,DataGrIDVIEwCellValIDatingEventArgs e){    if (string.IsNullOrEmpty(e.FormattedValue.ToString()))    {        DataGrIDVIEwCell cell = dataGrIDVIEw1.Rows[e.RowIndex].Cells[e.ColumnIndex];        cell.ErrorText =            "Company name must not be empty";        if (cell.Tag == null)        {            cell.Tag = cell.Style.padding;            cell.Style.padding = new padding(0,18,0);        }        e.Cancel = true;    }    else    {        dataGrIDVIEw1.Rows[e.RowIndex].ErrorText = string.Empty;    }}

这样可以看到图标,而不是编辑控件已经移动,除了图标已经移动了!所以我们还需要绘制一个新图标.

voID dataGrIDVIEw1_CellPainting(object sender,DataGrIDVIEwCellPaintingEventArgs e){    if (dataGrIDVIEw1.IsCurrentCellDirty)    {        if (!string.IsNullOrEmpty(e.ErrorText))        {            GraphicsContainer container = e.Graphics.BeginContainer();            e.Graphics.Translatetransform(18,0);            e.Paint(this.ClIEntRectangle,DataGrIDVIEwPaintParts.ErrorIcon);            e.Graphics.EndContainer(container);            e.Handled = true;        }    }}

然后,当您在单元格上结束编辑时,您需要重置填充:

voID dataGrIDVIEw1_CellEndEdit(object sender,DataGrIDVIEwCellEventArgs e){    if (!string.IsNullOrEmpty(dataGrIDVIEw1[e.ColumnIndex,e.RowIndex].ErrorText))    {        DataGrIDVIEwCell cell = dataGrIDVIEw1.Rows[e.RowIndex].Cells[e.ColumnIndex];        cell.ErrorText = string.Empty;        cell.Style.padding = (padding)cell.Tag;        cell.Tag = null;    }}

我发现这个帖子忽略了将鼠标设置为新绘制的图标 – 这里有一些粗略的代码可以解决这个问题,我没有时间让它真正起作用所以有一些想要解决的轻微捏造 – 我如果我在一分钟后得到它,我会整理一下.

我设置DataGrIDVIEw.ShowCelltooltips = true并引入一个布尔inError来跟踪我们当前是否有编辑错误.然后我处理MouseHover事件:

voID dataGrIDVIEw1_MouseHover(object sender,EventArgs e){    if (inError)    {                        Point pos = this.PointToClIEnt(Cursor.position);                       if (r.Contains(pos.X - 20,pos.Y - 5))        {                               t.Show("There was an error",dataGrIDVIEw1.EditingControl,3000);         }    }}

该代码中的t是表单级别的tooltip控件,r是一个矩形.

我在单元格绘制处理程序中填充如下所示的r:

voID dataGrIDVIEw1_CellPainting(object sender,DataGrIDVIEwCellPaintingEventArgs e){    if (dataGrIDVIEw1.IsCurrentCellDirty)    {        if (!string.IsNullOrEmpty(e.ErrorText))        {                        GraphicsContainer container = e.Graphics.BeginContainer();            r = dataGrIDVIEw1.GetCelldisplayRectangle(e.ColumnIndex,e.RowIndex,true);            e.Graphics.Translatetransform(18,DataGrIDVIEwPaintParts.ErrorIcon);            e.Graphics.EndContainer(container);                        e.Handled = true;        }    }}

我对位置点的负20和负5感到不满 – 如果我有更多的时间,那就是我要解决的问题.

总结

以上是内存溢出为你收集整理的c# – Winforms:验证datagridview中的单元格的问题全部内容,希望文章能够帮你解决c# – Winforms:验证datagridview中的单元格的问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1250018.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-07
下一篇2022-06-07

发表评论

登录后才能评论

评论列表(0条)

    保存