[求教]关于ComboBox手动设置焦点,调用窗体Validate事件后,不能正常下拉

蜡笔小秋 2014-03-24 10:09:37
业务背景:

数据新增窗体,有一个字段用到了ComboBox(cboFileDate)控件,此字段为必填,验证用到了Validating事件和ErrorProvider(epErrInfo)控件。

考虑到如果用户不进入ComboBox焦点,直接点击保存按钮,也需要对ComboBox进行验证。实现代码如下:


private void cboPhaseID_Validating(object sender, CancelEventArgs e)
{
if (this.cboPhaseID.SelectedIndex == -1)
{
e.Cancel = true;
this.epErrInfo.SetError(this.cboPhaseID, "请选择一项!");
}
else
{
this.epErrInfo.SetError(this.cboPhaseID, "");
}
}



private void btnSave_Click(object sender, EventArgs e)
{
List<Control> list = new List<Control>(); //需要验证的控件集合
list.Add(cboPhaseID);
//......
foreach (var item in list)
{
item.Focus();
if (!this.Validate())
{
return;
}
}
//TO DO 保存数据到数据库
}


出现的异常:用户不进入ComboBox焦点,直接点击保存按钮后。点击cboFileDate,下拉项可以正常下拉,鼠标释放后,下拉项会自动收起,导致不能对cboFileDate绑定的值进行选取。

另外发现,此异常下在cboFileDate控件上按住鼠标左键拖拽可以选取...
...全文
366 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
蜡笔小秋 2014-03-31
  • 打赏
  • 举报
回复
引用 5 楼 wyd1520 的回复:
private void cboPhaseID_Validating(object sender, CancelEventArgs e) CS方式没必要用到这种方法 直接在你的按下的按钮事件中加入 就可以了 if (this.cboPhaseID.SelectedIndex == -1) { this.epErrInfo.SetError(this.cboPhaseID, "请选择一项!"); } else { this.epErrInfo.SetError(this.cboPhaseID, ""); }
受到5楼的启发 最终的解决方案如下: 所有验证还是写到控件的Validating事件中 去掉了e.Cancel = true;【需要的控件比较多时,考虑后期进一步对Validating事件进行封装,以批量注册Validating事件,传入验证类型,调用通用验证类,窗口关闭时销毁所有Validating事件】
蜡笔小秋 2014-03-26
  • 打赏
  • 举报
回复
引用 13 楼 rui_china 的回复:
直接做弹出提示算了
最简单但也最遭用户反感的提示方式! 你接收的了这种提示方式吗?
灬浪子灬 2014-03-26
  • 打赏
  • 举报
回复
引用 楼主 u011300178 的回复:
业务背景: 数据新增窗体,有一个字段用到了ComboBox(cboFileDate)控件,此字段为必填,验证用到了Validating事件和ErrorProvider(epErrInfo)控件。 考虑到如果用户不进入ComboBox焦点,直接点击保存按钮,也需要对ComboBox进行验证。实现代码如下:

 private void cboPhaseID_Validating(object sender, CancelEventArgs e)
        {
            if (this.cboPhaseID.SelectedIndex == -1)
            {
                e.Cancel = true;
                this.epErrInfo.SetError(this.cboPhaseID, "请选择一项!");
            }
            else
            {
                this.epErrInfo.SetError(this.cboPhaseID, "");
            }
        }

private void btnSave_Click(object sender, EventArgs e)
        {
            List<Control> list = new List<Control>();  //需要验证的控件集合
            list.Add(cboPhaseID);
            //......
            foreach (var item in list)
            {
                item.Focus();
                if (!this.Validate())
                {
                    return;
                }
            }
           //TO DO  保存数据到数据库
        }
出现的异常:用户不进入ComboBox焦点,直接点击保存按钮后。点击cboFileDate,下拉项可以正常下拉,鼠标释放后,下拉项会自动收起,导致不能对cboFileDate绑定的值进行选取。 另外发现,此异常下在cboFileDate控件上按住鼠标左键拖拽可以选取...
直接做弹出提示算了
threenewbee 2014-03-25
  • 打赏
  • 举报
回复
WinForms就发在这里就可以了。
蜡笔小秋 2014-03-25
  • 打赏
  • 举报
回复
引用 7 楼 rui_china 的回复:
[quote=引用 楼主 u011300178 的回复:]
DropDownClosed时间不能处理?[/quote] 点击一下ComboBox,执行完DropDown后会自动进入DropDownClosed事件,DropDownClosed事件按理不应该触发的 表现为点一下ComboBox,下拉项展开又自动收起了,没办法点击需要选中的值 正常是点一下ComboBox,下拉项展开,点击需要选中的值,下拉项收起
灬浪子灬 2014-03-25
  • 打赏
  • 举报
回复
引用 楼主 u011300178 的回复:
DropDownClosed时间不能处理?
蜡笔小秋 2014-03-25
  • 打赏
  • 举报
回复
引用 11 楼 qyj2009 的回复:
[quote=引用 9 楼 u011300178 的回复:]
提交的时候验证好一些吧[/quote] 这个是开发人员的思路,用户应该更偏向于实时提示
水目 2014-03-25
  • 打赏
  • 举报
回复
引用 9 楼 u011300178 的回复:
提交的时候验证好一些吧
蜡笔小秋 2014-03-25
  • 打赏
  • 举报
回复
引用 5 楼 wyd1520 的回复:
private void cboPhaseID_Validating(object sender, CancelEventArgs e) CS方式没必要用到这种方法 直接在你的按下的按钮事件中加入 就可以了 if (this.cboPhaseID.SelectedIndex == -1) { this.epErrInfo.SetError(this.cboPhaseID, "请选择一项!"); } else { this.epErrInfo.SetError(this.cboPhaseID, ""); }
用cboPhaseID_Validating用这个事件我是想实时的将错误反馈给用户,即焦点离开,就进行验证,存在问题马上提示 非常谢谢,根据你的回答,我想到了另外一个思路,cboPhaseID_Validating事件里不去设置“e.Cancel = true;”,在保存事件里判断errorprovider控件有没有提示错误,如果所有控件的都没有提示过错误则进行数据保存。 不过我目前只了解到可以借助errorprovider的GetError事件对单个控件的有没有错误提示进行判断 errorprovider有没有其他属性和方法对所有控件一次性验证有没有错误提示
本拉灯 2014-03-24
  • 打赏
  • 举报
回复
private void cboPhaseID_Validating(object sender, CancelEventArgs e) CS方式没必要用到这种方法 直接在你的按下的按钮事件中加入 就可以了 if (this.cboPhaseID.SelectedIndex == -1) { this.epErrInfo.SetError(this.cboPhaseID, "请选择一项!"); } else { this.epErrInfo.SetError(this.cboPhaseID, ""); }
蜡笔小秋 2014-03-24
  • 打赏
  • 举报
回复
自己顶下 我是做B/S项目的,项目需要做一个C/S小工具,是我的这种验证方式有问题吗? 另外弱弱的问下@caozhy,我有发错版块吗?我没有找到WinForm版块
Alan_Chao 2014-03-24
  • 打赏
  • 举报
回复
关注,我也遇到类似问题
蜡笔小秋 2014-03-24
  • 打赏
  • 举报
回复
蜡笔小秋 2014-03-24
  • 打赏
  • 举报
回复
最近比较忙,抽空做了最新版的API,本次的主要精力就是放在了pdf版的文档上面,看了上一版好多人反应说希望保留chm格式的,所以这一版继续提供chm格式的文档给大家了,现在的版本中包含了PDF、EXE和CHM 3种格式的文档,相信应该可以满足大家的需要了。此外我个人推荐大家使用PDF格式的文档,因为PDF是全新制作的,内容进行了完整校对,所以错漏的地方比EXE和CHM格式要少很多。其它废话就不多说了。更新内容自己看更新说明吧! jQuery EasyUI 1.5.1版本更新内容: Bug(修复) datagrid:修复在调用“updateRow”方法之后选中和复选行标志丢失的问题; tabs:修复在调用“update”方法的时候导致标签栏工具错位的问题; window:修复在窗体高度设置为“auto”时,当移动窗体窗体会丢失的问题; messager:修复在现实进度消息窗口后立即关闭该窗口会导致程序发生异常的问题; form:修复“clear”方法无法清除combobox组件选择的下拉项的问题。 Improvement(改进) textbox:可以用“cls”属性添加自定义样式; numberbox:允许用户使用意大利货币格式; combo:添加“multivalue”属性,允许用户决定如何提交多个值; combobox:添加“reversed”属性; combobox:添加“onClick”事件; combogrid:添加“reversed”属性; treegrid:使用Shift键启用多值选择。 New Plugin(新组件) tagbox:允许用户在表单字段上添加标签。
本次更新,我将文档从头到尾和官网发布的最新内容校对了一次,将所有的错误和遗漏的API全部补全和修复了。快半年了,EasyUI又更新了。这次依然以BUG修复和功能改进为主,EasyUI发展至今,主体功能已经基本完善。即便以后还有新组件,那也是在现有功能完善的基础上新增一些小组件了,类似Datagrid这类的大型复合组件应该比较少了,相比新组件我更期待官方能对EasyUI的性能优化多下下功夫。 jQuery EasyUI 1.4.5版本更新内容: Bug(修复) datagrid:修复在调用updateRow方法之后使用getChanges方法无法返回被更新的行的BUG; treegrid:修复在追加或插入新行的时候触发onLoadSuccess事件的BUG; tree:修复在追加或插入新节点的时候触发onLoadSuccess事件的BUG。 Improvement(改进) window:可以自定义显示样式了; window:新增“border”属性允许用户设置不同的边框样式; navpanel:新增“href”属性用以从远程服务器加载显示内容; combotree:“setValue”和“setValues”方法增加“id”和“text”形参; combobox:新增“showItemIcon”属性; combobox:在“groupPosition”属性值设置为“sticky”时,将会将选项分组标签固顶在下拉栏中; messager:当敲击回车键时将默认触发消息框的第一个按钮; validatebox:新增“editable”、“disabled”、“readonly”、“validateOnCreate”和“validateOnBlur”属性; validatebox:新增“enable”、“disable”、“readonly”和“resetValidation”方法; validatebox:允许用户来决定如何显示错误消息; filebox:新增“accept”和“multiple”属性; treegrid:新增复选框的选择; treegrid:新增“getCheckedNodes”、“checkNode”和“uncheckNode”方法; form:新增“iframe”属性;(官方未提及) form:新增“onProgress”事件;(官方未提及) form:新增“resetValidation”方法。(官方未提及)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧