wpf C1FlexGrid 新追加行的验证问题
wpf C1FlexGrid 新追加行的验证如何实现如果新追加行某列出现了验证问题,如何实现在新追加行中出错的那列被红框框起来重点是新追加的行((ListCollectionView)grid.CollectionView).IsAddingNew 还得是False而不是True
也就是说该行还是新追加行 ((ListCollectionView)grid.CollectionView).IsAddingNew= true,但是在页面显示中该行要对错误列圈起红框(并且还有Error信息)
可以在我上传的demo上修正
回复 1楼q406157290的帖子
谢谢反馈,Demo我收到了。
我和@KNight帮你调了一年程序,这临近过年的是不是会发个红包神马的:D
下面来看看你的问题,新行在输入后就会变成实实在在的行,然后又有新行产生。所以我不理解你的意思是要在新行上显示验证信息么?
另外看你在其他帖子已经和KNight讨论过验证的问题,现在是需要改变需求么? 回复 2楼Alice的帖子
:i0tw:哈哈真是辛苦辛苦了 ,打扰你们一年多了真的是不好意思啊
加微信给发红包:itwn:
我的意思是 在新追加一行时,这时候就有可能有类似必须输入的验证,当新追加行存在某些项没有输入的情况下,没有输入内容的单元格被红框圈起来,并且错误的信息也显示在行头(红色叹号) 和该单元格鼠标一经过的地方,但是该行还要是新追加行状态,不变成普通行,只有所有的验证都通过了,换行的时候才让它提交成普通行
我现在发现的是当新追加行的时候,不会进入这个public override string this{}方法里去验证,只有成了普通行才会进入该方法去验证,有没有什么办法在新追加行的状态下也让他进入该方法去验证呢 回复 3楼q406157290的帖子
你的意思是在新增行只有在验证全部通过并且换行后才会变成普通行,否则一直为新增行状态并且带有验证效果的吗?
BTW,Demo里是哪个界面?默认是ComBoxWindow.xaml? 回复 4楼KNight的帖子
对对对 就是您的意思 就是ComBoxWindow这个画面,可以随意在那上面修正 辛苦了 回复 2楼Alice的帖子 在重绘单元格过程中,对于获取排他错误信息有一段如下代码:
private string GetRowErrors(Column col)
{
if (this.Grid == null)
{
return null;
}
IEditableCollectionView editableCollectionView = this.Grid.CollectionView as IEditableCollectionView;
if (editableCollectionView != null && this.DataItem == editableCollectionView.CurrentAddItem)
{
return null;
}
...
}
由以上代码可知,当该行数据项 this.DataItem 等于 当前编辑视图 IEditableCollectionView 的新增项 CurrentAddItem 时,获取的排他错误为 null,所以导致新增行如果还未换行保存,是不进行排他效果显示的;(实际上,新增行未换行前,属于挂起状态,所以不进行排他验证吧)
两种解决方案:
1、在 C1FlexGrid 的 CellEditEnded 事件中结束事务并保存挂起的新项,
(flexGrid.CollectionView as IEditableCollectionView).CommitNew();
但是这样该行就属于普通行,不属于新增行了;如此的话,只有添加一个变量标记该新增项,作为以后其他的处理了;
2、还有一种解决方案就是把 CellFactory 中的 ApplyCellStyles 方法重新,自己重写 GetErrors 方法,把 if (editableCollectionView != null && this.DataItem == editableCollectionView.CurrentAddItem) 的判断移除,应该就可以达到你要的效果了;
public override void ApplyCellStyles(C1FlexGrid grid, CellType cellType, CellRange rng, Border bdr)
{
base.ApplyCellStyles(grid, cellType, rng, bdr);
GridPanel panel = grid.Cells;
Row row = panel.Rows;
Column column = panel.Columns;
CellStyle cellStyle = row.CellStyle;
CellStyle cellStyle2 = column.CellStyle;
if (panel.CellType == CellType.Cell && grid.ShowErrors && grid.ErrorStyle != null)
{
string errors = GetErrors(row, column);
if (!string.IsNullOrEmpty(errors))
{
grid.ErrorStyle.Apply(bdr);
this.SetErrorTip(grid, bdr, errors);
}
}
}
private string GetErrors(Row row, Column col)
{
string text = (col != null) ? col.BoundPropertyName : null;
DataRowView dataRowView = row.DataItem as DataRowView;
if (dataRowView != null)
{
if (!dataRowView.Row.HasErrors)
{
return null;
}
if (col != null)
{
return dataRowView.Row.GetColumnError(col.ColumnName);
}
else
{
List<string> list = new List<string>();
if (!string.IsNullOrEmpty(dataRowView.Row.RowError))
{
list.Add(dataRowView.Row.RowError);
}
foreach (Column current in row.Grid.Columns)
{
string columnError;
columnError = dataRowView.Row.GetColumnError(current.ColumnName);
if (!string.IsNullOrEmpty(columnError) && !list.Contains(columnError))
{
list.Add(columnError);
}
}
if (list.Count <= 0)
{
return null;
}
return string.Join("\r\n", list.ToArray());
}
}
else
{
IDataErrorInfo dataErrorInfo = row.DataItem as IDataErrorInfo;
if (dataErrorInfo == null)
{
return null;
}
if (!string.IsNullOrEmpty(text))
{
return dataErrorInfo;
}
List<string> list2 = new List<string>();
if (!string.IsNullOrEmpty(dataErrorInfo.Error))
{
list2.Add(dataErrorInfo.Error);
}
foreach (Column current2 in row.Grid.Columns)
{
if (!string.IsNullOrEmpty(current2.BoundPropertyName))
{
string text2 = dataErrorInfo;
if (!string.IsNullOrEmpty(text2) && !list2.Contains(text2))
{
list2.Add(text2);
}
}
}
if (list2.Count <= 0)
{
return null;
}
return string.Join("\r\n", list2.ToArray());
}
} 回复 7楼KNight的帖子
:i0tw::i0tw: 回复 8楼q406157290的帖子
谢谢@KNight的反馈和非常迅速的解决问题能力。 回复 7楼KNight的帖子
非常谢谢您 我稍后试一下太感谢了