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

Qiu0533 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控件上按住鼠标左键拖拽可以选取...
...全文
372 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Qiu0533 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事件】
Qiu0533 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就发在这里就可以了。
Qiu0533 2014-03-25
  • 打赏
  • 举报
回复
引用 7 楼 rui_china 的回复:
[quote=引用 楼主 u011300178 的回复:]
DropDownClosed时间不能处理?[/quote] 点击一下ComboBox,执行完DropDown后会自动进入DropDownClosed事件,DropDownClosed事件按理不应该触发的 表现为点一下ComboBox,下拉项展开又自动收起了,没办法点击需要选中的值 正常是点一下ComboBox,下拉项展开,点击需要选中的值,下拉项收起
灬浪子灬 2014-03-25
  • 打赏
  • 举报
回复
引用 楼主 u011300178 的回复:
DropDownClosed时间不能处理?
Qiu0533 2014-03-25
  • 打赏
  • 举报
回复
引用 11 楼 qyj2009 的回复:
[quote=引用 9 楼 u011300178 的回复:]
提交的时候验证好一些吧[/quote] 这个是开发人员的思路,用户应该更偏向于实时提示
水目 2014-03-25
  • 打赏
  • 举报
回复
引用 9 楼 u011300178 的回复:
提交的时候验证好一些吧
Qiu0533 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, ""); }
Qiu0533 2014-03-24
  • 打赏
  • 举报
回复
自己顶下 我是做B/S项目的,项目需要做一个C/S小工具,是我的这种验证方式有问题吗? 另外弱弱的问下@caozhy,我有发错版块吗?我没有找到WinForm版块
Alan_Chao 2014-03-24
  • 打赏
  • 举报
回复
关注,我也遇到类似问题
Qiu0533 2014-03-24
  • 打赏
  • 举报
回复
Qiu0533 2014-03-24
  • 打赏
  • 举报
回复

111,098

社区成员

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

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

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