找回密码
 立即注册

QQ登录

只需一步,快速开始

q406157290

高级会员

124

主题

531

帖子

1359

积分

高级会员

积分
1359

活字格认证

q406157290
高级会员   /  发表于:2016-1-26 15:03  /   查看:26061  /  回复:35
wpf C1FlexGrid 新追加行的验证
如何实现如果新追加行某列出现了验证问题,如何实现在新追加行中出错的那列被红框框起来重点是新追加的行((ListCollectionView)grid.CollectionView).IsAddingNew 还得是False而不是True
也就是说该行还是新追加行 ((ListCollectionView)grid.CollectionView).IsAddingNew  = true,但是在页面显示中该行要对错误列圈起红框(并且还有Error信息)
可以在我上传的demo上修正

本帖子中包含更多资源

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

x

35 个回复

倒序浏览
Alice
社区贡献组   /  发表于:2016-1-26 18:05:00
沙发
回复 1楼q406157290的帖子

谢谢反馈,Demo我收到了。
我和@KNight帮你调了一年程序,这临近过年的是不是会发个红包神马的

下面来看看你的问题,新行在输入后就会变成实实在在的行,然后又有新行产生。所以我不理解你的意思是要在新行上显示验证信息么?
另外看你在其他帖子已经和KNight讨论过验证的问题,现在是需要改变需求么?
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
q406157290
高级会员   /  发表于:2016-1-27 08:21:00
板凳
回复 2楼Alice的帖子

哈哈真是辛苦辛苦了 ,打扰你们一年多了真的是不好意思啊
加微信给发红包
我的意思是 在新追加一行时,这时候就有可能有类似必须输入的验证,当新追加行存在某些项没有输入的情况下,没有输入内容的单元格被红框圈起来,并且错误的信息也显示在行头(红色叹号) 和该单元格鼠标一经过的地方,但是该行还要是新追加行状态,不变成普通行,只有所有的验证都通过了,换行的时候才让它提交成普通行
我现在发现的是当新追加行的时候,不会进入这个public override string this[string columnName]{}方法里去验证,只有成了普通行才会进入该方法去验证,有没有什么办法在新追加行的状态下也让他进入该方法去验证呢
回复 使用道具 举报
KNight
中级会员   /  发表于:2016-1-27 09:07:00
地板
回复 3楼q406157290的帖子

你的意思是在新增行只有在验证全部通过并且换行后才会变成普通行,否则一直为新增行状态并且带有验证效果的吗?

BTW,Demo里是哪个界面?默认是ComBoxWindow.xaml?
回复 使用道具 举报
q406157290
高级会员   /  发表于:2016-1-27 09:42:00
5#
回复 4楼KNight的帖子

对对对 就是您的意思 就是ComBoxWindow这个画面,可以随意在那上面修正 辛苦了
回复 使用道具 举报
q406157290
高级会员   /  发表于:2016-1-27 10:10:00
6#
回复 使用道具 举报
KNight
中级会员   /  发表于:2016-1-27 14:18:00
7#
在重绘单元格过程中,对于获取排他错误信息有一段如下代码:
  1. private string GetRowErrors(Column col)
  2. {
  3.         if (this.Grid == null)
  4.         {
  5.                 return null;
  6.         }
  7.         IEditableCollectionView editableCollectionView = this.Grid.CollectionView as IEditableCollectionView;
  8.         if (editableCollectionView != null && this.DataItem == editableCollectionView.CurrentAddItem)
  9.         {
  10.                 return null;
  11.         }
  12.         ...
  13. }
复制代码


由以上代码可知,当该行数据项 this.DataItem 等于 当前编辑视图 IEditableCollectionView 的新增项 CurrentAddItem 时,获取的排他错误为 null,所以导致新增行如果还未换行保存,是不进行排他效果显示的;(实际上,新增行未换行前,属于挂起状态,所以不进行排他验证吧)

两种解决方案:
1、在 C1FlexGrid 的 CellEditEnded 事件中结束事务并保存挂起的新项,
  1. (flexGrid.CollectionView as IEditableCollectionView).CommitNew();
复制代码

但是这样该行就属于普通行,不属于新增行了;如此的话,只有添加一个变量标记该新增项,作为以后其他的处理了;
2、还有一种解决方案就是把 CellFactory 中的 ApplyCellStyles 方法重新,自己重写 GetErrors 方法,把 if (editableCollectionView != null && this.DataItem == editableCollectionView.CurrentAddItem) 的判断移除,应该就可以达到你要的效果了;
  1. public override void ApplyCellStyles(C1FlexGrid grid, CellType cellType, CellRange rng, Border bdr)
  2. {
  3.         base.ApplyCellStyles(grid, cellType, rng, bdr);

  4.         GridPanel panel = grid.Cells;
  5.         Row row = panel.Rows[rng.Row];
  6.         Column column = panel.Columns[rng.Column];
  7.         CellStyle cellStyle = row.CellStyle;
  8.         CellStyle cellStyle2 = column.CellStyle;
  9.         if (panel.CellType == CellType.Cell && grid.ShowErrors && grid.ErrorStyle != null)
  10.         {
  11.                 string errors = GetErrors(row, column);
  12.                 if (!string.IsNullOrEmpty(errors))
  13.                 {
  14.                         grid.ErrorStyle.Apply(bdr);
  15.                         this.SetErrorTip(grid, bdr, errors);
  16.                 }
  17.         }
  18. }
  19. private string GetErrors(Row row, Column col)
  20. {
  21.         string text = (col != null) ? col.BoundPropertyName : null;
  22.         DataRowView dataRowView = row.DataItem as DataRowView;
  23.         if (dataRowView != null)
  24.         {
  25.                 if (!dataRowView.Row.HasErrors)
  26.                 {
  27.                         return null;
  28.                 }
  29.                 if (col != null)
  30.                 {
  31.                         return dataRowView.Row.GetColumnError(col.ColumnName);
  32.                 }
  33.                 else
  34.                 {
  35.                         List<string> list = new List<string>();
  36.                         if (!string.IsNullOrEmpty(dataRowView.Row.RowError))
  37.                         {
  38.                                 list.Add(dataRowView.Row.RowError);
  39.                         }
  40.                         foreach (Column current in row.Grid.Columns)
  41.                         {
  42.                                 string columnError;
  43.                                 columnError = dataRowView.Row.GetColumnError(current.ColumnName);
  44.                                 if (!string.IsNullOrEmpty(columnError) &amp;&amp; !list.Contains(columnError))
  45.                                 {
  46.                                         list.Add(columnError);
  47.                                 }
  48.                         }
  49.                         if (list.Count <= 0)
  50.                         {
  51.                                 return null;
  52.                         }
  53.                         return string.Join("\r\n", list.ToArray());
  54.                 }
  55.         }
  56.         else
  57.         {
  58.                 IDataErrorInfo dataErrorInfo = row.DataItem as IDataErrorInfo;
  59.                 if (dataErrorInfo == null)
  60.                 {
  61.                         return null;
  62.                 }
  63.                 if (!string.IsNullOrEmpty(text))
  64.                 {
  65.                         return dataErrorInfo[text];
  66.                 }
  67.                 List<string> list2 = new List<string>();
  68.                 if (!string.IsNullOrEmpty(dataErrorInfo.Error))
  69.                 {
  70.                         list2.Add(dataErrorInfo.Error);
  71.                 }
  72.                 foreach (Column current2 in row.Grid.Columns)
  73.                 {
  74.                         if (!string.IsNullOrEmpty(current2.BoundPropertyName))
  75.                         {
  76.                                 string text2 = dataErrorInfo[current2.BoundPropertyName];
  77.                                 if (!string.IsNullOrEmpty(text2) &amp;&amp; !list2.Contains(text2))
  78.                                 {
  79.                                         list2.Add(text2);
  80.                                 }
  81.                         }
  82.                 }
  83.                 if (list2.Count <= 0)
  84.                 {
  85.                         return null;
  86.                 }
  87.                 return string.Join("\r\n", list2.ToArray());
  88.         }
  89. }
复制代码

评分

参与人数 1金币 +999 满意度 +5 收起 理由
Alice + 999 + 5 太优秀了

查看全部评分

回复 使用道具 举报
q406157290
高级会员   /  发表于:2016-1-27 16:16:00
8#
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2016-1-27 17:48:00
9#
回复 8楼q406157290的帖子

谢谢@KNight的反馈和非常迅速的解决问题能力。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
q406157290
高级会员   /  发表于:2016-1-28 08:37:00
10#
回复 7楼KNight的帖子

非常谢谢您 我稍后试一下  太感谢了
回复 使用道具 举报
1234下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部