[C1] C1FlexGrid 排除非绑定列的验证效果
一、前言
前提是 C1FlexGrid 中存在数据绑定列和自定义列(非数据绑定列),此时如果该行编辑后出现排他错误,自定义列也会出现验证结果的红色边框:

但是自定义列如果只是一些按钮操作,提示说明什么的,与前面绑定的数据并无关系,不想参与到前面的排他错误提示,也就是不想要这个红色边框,该如何处理?
二、实现
using System.Collections.ObjectModel;
using System.ComponentModel; namespace Validation
{
public class DataObject : IDataErrorInfo
{
public string Name { get; set; }
public int Age { get; set; }
public string Sex { get; set; }
public string UpdateErrorMessage { get; set; } // property-level
public string this[string propertyName]
{
get
{
if (!string.IsNullOrEmpty(UpdateErrorMessage))
{
return UpdateErrorMessage;
}
if (propertyName == "Name" && string.IsNullOrWhiteSpace(Name))
{
return "Name is invalid!";
} return string.Empty;
}
} // item-level
string IDataErrorInfo.Error
{
get
{
if (!string.IsNullOrEmpty(UpdateErrorMessage))
{
return UpdateErrorMessage;
} return "";
}
} // 初始化数据源
public static ObservableCollection<DataObject> InitDataSource()
{
ObservableCollection<DataObject> itemSource = new ObservableCollection<DataObject>();
itemSource.Add(new DataObject() {
Name = "aa",
Age = 11,
Sex = "男" });
itemSource.Add(new DataObject() {
Name = "vv",
Age = 15,
Sex = "男" });
itemSource.Add(new DataObject() {
Name = "aa",
Age = 11,
Sex = "男" });
itemSource.Add(new DataObject() {
Name = "aa",
Age = 11,
Sex = "男" });
itemSource.Add(new DataObject() {
Name = "aa",
Age = 11,
Sex = "男" });
itemSource.Add(new DataObject() {
Name = "aa",
Age = 11,
Sex = "男" });
itemSource.Add(new DataObject() {
Name = "aa",
Age = 11,
Sex = "男" }); return itemSource;
}
}
}
数据对象
首先我模拟一个验证方法,当输入的 Name 为 kk 时,即出现排他错误:
// 数据验证
private bool Verify(int rowIndex)
{
bool flag = false;
DataObject selectedItem = (DataObject)flx.SelectedItem;
flag = (selectedItem != null && selectedItem.Name.Equals("kk")); return flag;
}
然后在行编辑完成时(RowEditEnding),进行判断处理排他错误信息:
private void flx_RowEditEnding(object sender, C1.WPF.FlexGrid.CellEditEventArgs e)
{
C1FlexGrid flexGrid = sender as C1FlexGrid;
// 满足某些条件时出现验证错误
if (Verify(e.Row))
{
((DataObject)flexGrid.SelectedItem).UpdateErrorMessage = "Error!!";
// 重绘当前行
flexGrid.Invalidate(new CellRange(e.Row, -1, e.Row, flexGrid.Columns.Count - 1));
// 重绘该行行头部分,已显示小红点提示
flexGrid.RowHeaders.Invalidate();
e.Cancel = true;
}
else
{
((DataObject)flexGrid.SelectedItem).UpdateErrorMessage = "";
}
}
其中
flexGrid.Invalidate(new CellRange(e.Row, -1, e.Row, flexGrid.Columns.Count - 1));
是为了重新绘制当前行,否则当设置完排他错误 UpdateErrorMessage 时,只会绘制当前单元格的红色边框,该行其他的单元格不会绘制;
其中
flexGrid.RowHeaders.Invalidate();
是为了绘制行头的那个红色点;
下面才是解决问题的关键:
其实也很简单,就是将最后自定义列重新绘制一遍即可:
public class MyCellFactory : CellFactory
{
public override void CreateCellContent(C1FlexGrid grid, Border bdr, CellRange rng)
{
base.CreateCellContent(grid, bdr, rng);
// 处理最后一列非绑定列的边框重绘
if (rng.Column == grid.Columns.Count - 1)
{
bdr.BorderThickness = new Thickness(0, 0, 1, 1);
bdr.BorderBrush = new SolidColorBrush(Color.FromArgb(255, 240, 240, 240));
bdr.UpdateDefaultStyle();
}
}
}
其中 base.CreateCellContent(grid, bdr, rng); 里面就已经将单元格的排他错误样式绘制完了,所以一定要在这之后再手动绘制自定义列,参考上面的代码;
最后实现的效果如下:

[C1] C1FlexGrid 排除非绑定列的验证效果的更多相关文章
- GridView 动态添加绑定列和模板列
动态添加绑定列很简单:例如: GridView1.DataSourceID = "SqlDataSource1"; BoundField bf1 = new BoundField( ...
- Silverlight C1.Silverlight.FlexGrid 表格动态列
很多时候,我们对于表格展示的数据,需要根据条件不停的变化,这就需要表格列能动态生成,即没有Model的概念(万物始于无形).先上主要代码: 一.根据参数绑定列定义 二.根据数据动态创建数据对象,并添加 ...
- DEV XtraGrid绑定非绑定列(转)
在Gridview创建一列 .将该列的UnboundType属性设置为bound(默认值)以外的数据类型 为该列设置一个窗体内全局唯一的FieldName,注意这个FieldName甚至不能出现在 ...
- 在php中使用对称加密DES3,开发银行卡绑定,实名验证……
对称加密:对称加密是一种数据加密算法,对一组数据的加密和解密都使用一样的密钥(key),可以有效保护金融数据,常见的对称加密有DES,3DES,AES.RC2.RC4.RC5. DES3: 对DES算 ...
- WPF DATAGrid 空白列 后台绑定列 处理
原文:WPF DATAGrid 空白列 后台绑定列 处理 AutoGenerateColumns <DataGrid x:Name="dataGrid" Margin=&qu ...
- 管理员技术(五): 配置文档的访问权限、 配置附加权限、绑定到LDAP验证服务、配置LDAP家目录漫游
一.配置文档的访问权限 问题: 本例要求将文件 /etc/fstab 拷贝为 /var/tmp/fstab,并调整文件 /var/tmp/fstab的权限,满足以下要求: 1> 此文件的拥有者 ...
- 【bootstrapValidator 不验证】使用bootstrapValidator 验证效果不起作用
虽然在页面ready的时候 就绑定了验证表单 ,但是在点击提交按钮之后 依旧没有验证的效果 . 那就在提交按钮的点击事件中 添加一句话: $(document).ready( function () ...
- Jquery绑定事件及动画效果
Jquery绑定事件及动画效果 本文转载于:https://blog.csdn.net/Day_and_Night_2017/article/details/85799522 绑定事件 bind(ty ...
- [C1] C1FlexGrid 行列增删&单元格合并拆分
上一篇中实现了 C1FlexGrid的撤销还原功能,这篇是要仿 Excel 做一个行列删除以及单元格的自由合并拆分,楼主怕在原工程里复杂的说不清道不明,所以干脆提取出来做了一个 Demo 来说明实现过 ...
随机推荐
- Android学习路线总结,绝对干货
title: Android学习路线总结,绝对干货 tags: Android学习路线,Android学习资料,怎么学习android grammar_cjkRuby: true --- 一.前言 不 ...
- Entity Framework 手动使用migration里面的up 和down方法。
add-migration -IgnoreChanges 201606100717405_201606100645298_InitialCreate 执行这一句后 ,清空使用map生成的代码,个人不太 ...
- MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句
第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...
- 内存映射文件MemoryMappedFile使用
参考资料: http://blog.csdn.net/bitfan/article/details/4438458 所谓内存映射文件,其实就是在内存中开辟出一块存放数据的专用区域,这区域往往与硬盘上特 ...
- PHP static静态属性和静态方法
这里分析了php面向对象中static静态属性和静态方法的调用.关于它们的调用(能不能调用,怎么样调用),需要弄明白了他们在内存中存放位置,这样就非常容易理解了.静态属性.方法(包括静态与非静态)在内 ...
- PHP设计模式(二)工厂方法模式(Factory Method For PHP)
简单工厂简述: 简单工厂模式实现了生产产品类的代码跟客户端代码分离,在工厂类中你可以添加需要生成长跑的逻辑代码(new 产品类),但是问题来了,优秀的代码是符合"开闭原则"如果你要 ...
- Cesium简介以及离线部署运行
Cesium简介 cesium是国外一个基于JavaScript编写的使用WebGL的地图引擎,一款开源3DGIS的js库.cesium支持3D,2D,2.5D形式的地图展示,可以自行绘制图形,高亮区 ...
- Mono 3.8发布:性能进一步改进,可伸缩性提升
9月4日,Mono 3.8.0发布了.该版本的运行时带来了一些性能和可伸缩性方面的改进,同时完成了向Windows平台的移植. Mono遵循Gnome和Linux内核的版本编号策略,这意味着3.8是3 ...
- 如何利用mono把.net windows service程序迁移到linux上
How to migrate a .NET Windows Service application to Linux using mono? 写在最前:之所以用要把windows程序迁移到Linux上 ...
- Ubuntu部署python3.5的开发和运行环境
Ubuntu部署python3.5的开发和运行环境 1 概述 由于最近项目全部由python2.x转向 python3.x(使用目前最新的 python3.5.1) ,之前的云主机的的默认python ...