找回密码
 立即注册

QQ登录

只需一步,快速开始

q406157290
高级会员   /  发表于:2015-9-7 08:33:00
11#
回复 8楼KNight的帖子

我的逻辑就是当焦点离开该行后,数据就会做更新处理(当然先比较数据有无变化,有变化就更新数据库),所以更新的逻辑写在了RowEditEnding事件中,
当更新排他时就让它出现验证错误
我的目的是按ESC能撤回到没出错误前的数据,所以当出现错误我就e.cancle = true;如使该行还处于编辑状态,按ESC时再进入该事件处理if(e.cancleEidt == true ){}里面撤销以前状态的逻辑
当没有按ESC,用户又点击该行进行编辑然后更新,如果本来就有验证错误了,我就会直接跳出去,就会执行下面代码
foreach(Row  r in flexGrid.Rows)
{
foreach(Column c in flexGrid.Columns)
{
如果有验证错误 就跳出去,并且还不能结束行编辑状态(为了按ESC的时候还能进入该事件)
e.cancle = true;//目的还是按ESC能进入该事件
return;
}
}
可是就是上面的代码中的e.cancle = true的处理导致验证的红框出不来了,我还是没能理解为什么
请问你有好的处理方法吗:-D
回复 使用道具 举报
KNight
中级会员   /  发表于:2015-9-7 14:50:00
12#
回复 11楼q406157290的帖子

红框不出来,是因为如下代码:
  1. public string this[string propertyName]
  2. {
  3.         get
  4.         {
  5.                 return "";
  6.         }
  7. }
  8. string IDataErrorInfo.Error
  9. {
  10.         get
  11.         {
  12.                 if (!string.IsNullOrEmpty(UpdateErrorMessage))
  13.                 {
  14.                         return UpdateErrorMessage;
  15.                 }

  16.                 return "";
  17.         }
  18. }
复制代码

前几列绑定数据列是根据this[string propertyName]来获取排它错误信息的,除非像最后一列非绑定列(即该列的BoundPropertyName属性为空)时才会取Error设置的排它错误信息;
至于C1FlexGrid是如何获取排它错误的,可参考如下部分代码():
  1. IDataErrorInfo dataErrorInfo = this.DataItem as IDataErrorInfo;
  2. if (dataErrorInfo == null)
  3. {
  4.         return null;
  5. }
  6. if (!string.IsNullOrEmpty(text))
  7. {
  8.         return dataErrorInfo[text];
  9. }
  10. List<string> list2 = new List<string>();
  11. if (!string.IsNullOrEmpty(dataErrorInfo.Error))
  12. {
  13.         list2.Add(dataErrorInfo.Error);
  14. }
  15. foreach (Column current2 in this.Grid.Columns)
  16. {
  17.         if (!string.IsNullOrEmpty(current2.BoundPropertyName))
  18.         {
  19.                 string text2 = dataErrorInfo[current2.BoundPropertyName];
  20.                 if (!string.IsNullOrEmpty(text2) &amp;&amp; !list2.Contains(text2))
  21.                 {
  22.                         list2.Add(text2);
  23.                 }
  24.         }
  25. }
  26. if (list2.Count <= 0)
  27. {
  28.         return null;
  29. }
  30. return string.Join("\r\n", list2.ToArray());
复制代码

其中text就是我上面提到的该列BoundPropertyName的属性值;
很明显,想前面几列绑定的列,都有对应的BoundPropertyName值(即上面代码的text),所以直接取得dataErrorInfo[text];返回了,根本不管你设置的Error;

提供解决Demo,仅供参考,看符合您的要求不?

本帖子中包含更多资源

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

x

评分

参与人数 1满意度 +5 收起 理由
q406157290 + 5 厲害

查看全部评分

回复 使用道具 举报
Alice
社区贡献组   /  发表于:2015-9-7 18:21:00
13#
回复 12楼KNight的帖子

谢谢@KNight.
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

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

最近一直都在解決別的問題 所以就沒有試這個 ,等我試過後給您回复 ,真的是非常感謝您
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2015-9-8 12:29:00
15#
回复 14楼q406157290的帖子

@q406157290 ,谢谢反馈。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

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



您給我的demo我看過了
我发现还是有问题当出现验证错误时  每个单元格确实出现了红框,可是RowError没有出来,就是每行最前面的那个小红点(如图2所示)没有显示出来
可是当在进入某单元格编辑再结束编辑后 那个小红点就出来了
我想要的是出现验证错误后 前面的小红点也是要出来的
麻烦您再看看 谢谢您了

给您提完这个问题我后来把该问题解决了
您看对吗
  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.                                 ((MySelf)flexGrid.SelectedItem).UpdateErrorMessage = &quot;Error!!&quot;;
  8.                                 // 重绘当前行
  9.                                 flexGrid.Invalidate(new CellRange(e.Row, 0, e.Row, flexGrid.Columns.Count - 1));
  10. flexGrid.StartEditing(false);//添加的就是这两行代码就可以了
  11. flexGrid.FinishEditing(false);                       
  12. }
  13.                         else
  14.                         {
  15.                                 ((MySelf)flexGrid.SelectedItem).UpdateErrorMessage = &quot;&quot;;
  16.                         }
  17.                         // 当有验证错误时,取消行编辑
  18.                         Row r = flexGrid.Rows[e.Row];
  19.                         foreach (Column c in flexGrid.Columns)
  20.                         {
  21.                                 if (!string.IsNullOrEmpty(r.GetErrors(c)))
  22.                                 {
  23.                                         e.Cancel = true;
  24.                                         return;
  25.                                 }
  26.                         }
  27.                 }
复制代码

本帖子中包含更多资源

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

x
回复 使用道具 举报
KNight
中级会员   /  发表于:2015-9-10 15:03:00
17#
回复 16楼q406157290的帖子

用 flexGrid.RowHeaders.Invalidate(); 这个替换那两句更好吧,其实 flexGrid.Invalidate(new CellRange(e.Row, 0, e.Row, flexGrid.Columns.Count - 1)); 这句是绘制该行内容单元格的,就是每个单元格都显示红框;而前面那个小红点是行头部分的,在加一句 flexGrid.RowHeaders.Invalidate(/**该行行头单元格**/); 即可了;

评分

参与人数 1满意度 +5 收起 理由
q406157290 + 5 厲害啊

查看全部评分

回复 使用道具 举报
q406157290
高级会员   /  发表于:2015-9-10 16:57:00
18#
回复 17楼KNight的帖子

厲害厲害
回复 使用道具 举报
KNight
中级会员   /  发表于:2015-9-10 17:43:00
19#
回复 18楼q406157290的帖子

来个评分吧,谢谢

评分

参与人数 1金币 +999 收起 理由
iceman + 999 协助用户解决问题

查看全部评分

回复 使用道具 举报
iceman
社区贡献组   /  发表于:2015-9-11 09:54:00
20#
回复 19楼KNight的帖子

你帅呆了,+1000 金币~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部