找回密码
 立即注册

QQ登录

只需一步,快速开始

q406157290
高级会员   /  发表于:2015-9-15 14:27:00
21#
回复 17楼KNight的帖子

現在還有個問題当flexGrid 允许追加新行的时候,如果追加的新行如果姓名为空的话就要出现Check并且该行还要处于编辑状态,可是这时候红框 和错误Error不显示啊
  1. var currentAddItem = ((ListCollectionView)flexGrid.CollectionView).CurrentAddItem;
  2.                 if (flexGrid.SelectedItem != null && currentAddItem != null && currentAddItem == flexGrid.SelectedItem)
  3.                 {
  4.                     //新追加行 如果姓名为空就check
  5.                     if (string.IsNullOrEmpty(((MySelf)flexGrid.SelectedItem).Name))
  6.                     {
  7.                         ((MySelf)flexGrid.SelectedItem).UpdateErrorMessage = "Error!!";
  8.                         // 重绘当前行
  9.                         flexGrid.Invalidate(new CellRange(e.Row, 0, e.Row, flexGrid.Columns.Count - 1));
  10.                     }
  11.                 }
复制代码

在myCheck_RowEditEnding中添加这样的代码不错验证红框啊
回复 使用道具 举报
KNight
中级会员   /  发表于:2015-9-15 15:12:00
22#
回复 21楼q406157290的帖子

这个不是这块儿的原因,原因解释如下:
  1. public string this[string propertyName]
  2. {
  3.         get
  4.         {
  5.                 if (!string.IsNullOrEmpty(UpdateErrorMessage))
  6.                 {
  7.                         return UpdateErrorMessage;
  8.                 }

  9.                 return "";
  10.         }
  11. }
复制代码

这儿对对应属性验证返回的错误提示信息,当验证Name属性时,如果没有UpdateErrorMessage它最后都返回""。所以,如果你想要让Name字段不为空,就要在这里加入自己的验证方法:
  1. public string this[string propertyName]
  2. {
  3.         get
  4.         {
  5.                 if (!string.IsNullOrEmpty(UpdateErrorMessage))
  6.                 {
  7.                         return UpdateErrorMessage;
  8.                 }
  9.                 if (propertyName == "Name" && string.IsNullOrWhiteSpace(Name))
  10.                 {
  11.                         return "Name is invalid!";
  12.                 }

  13.                 return "";
  14.         }
  15. }
复制代码
回复 使用道具 举报
q406157290
高级会员   /  发表于:2015-9-15 15:17:00
23#
回复 22楼KNight的帖子

呵呵 您说的这个我知道
但是看如下代码, 只要我把e.cancle = true;设置上  验证就不会出来了
  1. if (flexGrid.SelectedItem != null && currentAddItem != null && currentAddItem == flexGrid.SelectedItem)
  2.                 {
  3.                     //新追加行 如果姓名为空就check
  4.                     if (string.IsNullOrEmpty(((MySelf)flexGrid.SelectedItem).Name))
  5.                     {
  6.                         // 重绘当前行
  7.                         
  8.                         ((MySelf)flexGrid.SelectedItem).UpdateErrorMessage = "Error!!";
  9.                         // 重绘当前行
  10.                     flexGrid.Invalidate(new CellRange(e.Row, 0, e.Row, flexGrid.Columns.Count - 1));                        
  11. //e.Cancel = true;

  12.                         return;
  13.                     }
  14.                 }
复制代码

如果不设置e.cancle = true;该行就不会处于编辑状态了   只要设上e.cancle = true;model中的验证就不起作用了 我都纠结了好久了
回复 使用道具 举报
KNight
中级会员   /  发表于:2015-9-15 16:59:00
24#
回复 23楼q406157290的帖子

您说的不会处于编辑状态是指没有输入光标吗?我这里设置上e.cancle = true;依旧可以显示验证结果的,如果可以发一个Demo我给你看看吧。


这是我原先的代码(加入您所提到的e.Cancel = true;)
  1. private void myCheck_RowEditEnding(object sender, C1.WPF.FlexGrid.CellEditEventArgs e)
  2. {
  3.         C1FlexGrid flexGrid = sender as C1FlexGrid;
  4.         // 满足某些条件时出现验证错误
  5.         if (Verify(e.Row))
  6.         {
  7.                 ((DataObject)flexGrid.SelectedItem).UpdateErrorMessage = "Error!!";
  8.                 // 重绘当前行
  9.                 flexGrid.Invalidate(new CellRange(e.Row, -1, e.Row, flexGrid.Columns.Count - 1));
  10.                 // 重绘该行行头部分,已显示小红点提示
  11.                 flexGrid.RowHeaders.Invalidate();
  12.                 e.Cancel = true;
  13.         }
  14.         else
  15.         {
  16.                 ((DataObject)flexGrid.SelectedItem).UpdateErrorMessage = "";
  17.         }
  18.         // 当有验证错误时,取消行编辑
  19.         Row r = flexGrid.Rows[e.Row];
  20.         foreach (Column c in flexGrid.Columns)
  21.         {
  22.                 if (!string.IsNullOrEmpty(r.GetErrors(c)))
  23.                 {
  24.                         e.Cancel = true;
  25.                         return;
  26.                 }
  27.         }
  28. }
复制代码


执行效果如下图:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
q406157290
高级会员   /  发表于:2015-9-15 17:56:00
25#
回复 24楼KNight的帖子

普通行没有问题 可是新追加的行的check不显示呢下面是demo辛苦您了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
KNight
中级会员   /  发表于:2015-9-15 18:33:00
26#
回复 25楼q406157290的帖子

刚下班,晚上回去帮您搞定
回复 使用道具 举报
KNight
中级会员   /  发表于:2015-9-15 22:30:00
27#
回复 25楼q406157290的帖子

实际上,和普通行(已加载数据的行)不同的是,新增行时,就是双击之后C1FlexGrid添加了个新行之后,当(Name为空)离开该行进入RowEditEnding事件时,实际上这一行还未真正提交,你可以在该事件里查看((ListCollectionView)flexGrid.CollectionView).IsAddingNew的状态,是true,而普通行该状态为false,IsEditingItem为true;此时即使你在该事件里对UpdateErrorMessage排他错误进行赋值,最后r.GetErrors(c)也获取不到你刚赋值的错误信息;同时也可以参考r.GetErrors(c)其中一个判断条件:
  1. IEditableCollectionView editableCollectionView = this.Grid.CollectionView as IEditableCollectionView;
  2. if (editableCollectionView != null && this.DataItem == editableCollectionView.CurrentAddItem)
  3. {
  4.         return null;
  5. }
复制代码


即,如果它判断当前行为新增行时,是不会去处理获取排他错误的;而你可以在RowEditEnding加入如下代码进行监听:
  1. IEditableCollectionView editableCollectionView = flexGrid.CollectionView as IEditableCollectionView;
  2. if (editableCollectionView != null && flexGrid.SelectedItem == editableCollectionView.CurrentAddItem)
  3. {
  4.         MessageBox.Show("新增行仍未提交");
  5. }
复制代码

普通行是不会进入if里面的,只有新增行时才会,可见此时新增行实际上仍未提交;

参考解决办法:
  1. if (((ListCollectionView)flexGrid.CollectionView).IsAddingNew)
  2. {
  3.         // 手动提交
  4.         ((ListCollectionView)flexGrid.CollectionView).CommitNew();
  5.         // 更新
  6.         ((ListCollectionView)flexGrid.CollectionView).Refresh();
  7.         // 重新进入行编辑状态,不然再次点击其他行,改行实际上已经结束编辑状态了
  8.         ((ListCollectionView)flexGrid.CollectionView).EditItem(currentAddItem);
  9. }
复制代码


排他信息仍然在:
  1. public string this[string propertyName]
  2. {
  3.         get
  4.         {
  5.                 if (!string.IsNullOrEmpty(UpdateErrorMessage))
  6.                 {
  7.                         return UpdateErrorMessage;
  8.                 }
  9.         if (propertyName == "Name" && string.IsNullOrWhiteSpace(Name))
  10.         {
  11.             return "Name is invalid!";
  12.         }

  13.                 return "";
  14.         }
  15. }
复制代码

处处理;
而之前RowEditEnding事件里对排他错误处理可以注释掉,换成我上面写的手动提交并更新;

评分

参与人数 1金币 +500 满意度 +5 收起 理由
q406157290 + 500 + 5 奖励金币

查看全部评分

回复 使用道具 举报
q406157290
高级会员   /  发表于:2015-9-16 08:37:00
28#
回复 27楼KNight的帖子

太优秀了     
太厉害了  
我的难题都让您给解决了
真是太给力了
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2015-9-16 11:28:00
29#
回复 28楼q406157290的帖子

谢谢反馈。
此问题关闭,如果有新问题请开新帖。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
q406157290
高级会员   /  发表于:2015-9-17 08:37:00
30#
回复 27楼KNight的帖子

上次这个手动提交确实是个很好的方法
但是我的逻辑处理需要新追加行的样式跟普通行是不一样的,我是在CellFactory中判断是否为新规行然后设定样式的,如果手动提交上去就没有新规行了,本应该的新规行也成了普通行,样式就变了,所以还有别的处理方法吗真的麻烦您了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部