一、前言

前提是 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 排除非绑定列的验证效果的更多相关文章

  1. GridView 动态添加绑定列和模板列

    动态添加绑定列很简单:例如: GridView1.DataSourceID = "SqlDataSource1"; BoundField bf1 = new BoundField( ...

  2. Silverlight C1.Silverlight.FlexGrid 表格动态列

    很多时候,我们对于表格展示的数据,需要根据条件不停的变化,这就需要表格列能动态生成,即没有Model的概念(万物始于无形).先上主要代码: 一.根据参数绑定列定义 二.根据数据动态创建数据对象,并添加 ...

  3. DEV XtraGrid绑定非绑定列(转)

      在Gridview创建一列 .将该列的UnboundType属性设置为bound(默认值)以外的数据类型 为该列设置一个窗体内全局唯一的FieldName,注意这个FieldName甚至不能出现在 ...

  4. 在php中使用对称加密DES3,开发银行卡绑定,实名验证……

    对称加密:对称加密是一种数据加密算法,对一组数据的加密和解密都使用一样的密钥(key),可以有效保护金融数据,常见的对称加密有DES,3DES,AES.RC2.RC4.RC5. DES3: 对DES算 ...

  5. WPF DATAGrid 空白列 后台绑定列 处理

    原文:WPF DATAGrid 空白列 后台绑定列 处理 AutoGenerateColumns <DataGrid x:Name="dataGrid" Margin=&qu ...

  6. 管理员技术(五): 配置文档的访问权限、 配置附加权限、绑定到LDAP验证服务、配置LDAP家目录漫游

    一.配置文档的访问权限 问题: 本例要求将文件 /etc/fstab 拷贝为 /var/tmp/fstab,并调整文件 /var/tmp/fstab的权限,满足以下要求: 1>  此文件的拥有者 ...

  7. 【bootstrapValidator 不验证】使用bootstrapValidator 验证效果不起作用

    虽然在页面ready的时候 就绑定了验证表单 ,但是在点击提交按钮之后 依旧没有验证的效果 . 那就在提交按钮的点击事件中 添加一句话: $(document).ready( function () ...

  8. Jquery绑定事件及动画效果

    Jquery绑定事件及动画效果 本文转载于:https://blog.csdn.net/Day_and_Night_2017/article/details/85799522 绑定事件 bind(ty ...

  9. [C1] C1FlexGrid 行列增删&单元格合并拆分

    上一篇中实现了 C1FlexGrid的撤销还原功能,这篇是要仿 Excel 做一个行列删除以及单元格的自由合并拆分,楼主怕在原工程里复杂的说不清道不明,所以干脆提取出来做了一个 Demo 来说明实现过 ...

随机推荐

  1. vue入门学习(基础篇)

    vue入门学习总结: vue的一个组件包括三部分:template.style.script. vue的数据在data中定义使用. 数据渲染指令:v-text.v-html.{{}}. 隐藏未编译的标 ...

  2. ABP领域层

    1.实体Entites 1.1 概念 实体是DDD(领域驱动设计)的核心概念之一. 实体是具有唯一标识的ID且存储在数据库总.实体通常被映射成数据库中的一个表. 在ABP中,实体继承自Entity类. ...

  3. 【SAP业务模式】之ICS(六):发票输出类型

    这篇开始主要讲述发票输出类型: 首先我们新建一个发票类型,用于公司间的发票MIV,而标准的发票类型还是F2保持不变: 一.新建发票类型: 目录:SPRO-销售与分销-出具发票-开票凭证-定义出具发票类 ...

  4. iOS之计算上次日期距离现在多久, 如 xx 小时前、xx 分钟前等

    /**  *  计算上次日期距离现在多久  *  *  @param lastTime    上次日期(需要和格式对应)  *  @param format1     上次日期格式  *  @para ...

  5. 对Maven、gradle、svn、spring 3.0 fragment、git的想法

    1.Maven Maven可以构建项目,采用pom方式配置主项目和其他需要引用的项目.同时可结合spring3.0的新特性web  fragment. 从现实出发,特别是对于管理不到位,程序员整体素质 ...

  6. MongoDB备份(mongodump)和恢复(mongorestore)

    MongoDB提供了备份和恢复的功能,分别是MongoDB下载目录下的mongodump.exe和mongorestore.exe文件 1.备份数据使用下面的命令: >mongodump -h ...

  7. 钉钉开放平台demo调试异常问题解决:hostname in certificate didn't match

    今天研究钉钉的开放平台,结果一个demo整了半天,这帮助系统写的也很难懂.遇到两个问题: 1.首先是执行demo时报unable to find valid certification path to ...

  8. ASP.NET Aries JSAPI 文档说明:AR.Utility

    AR.Utility 文档 1:方法: 名称 说明 queryString function (key) *模拟.NET的Request对象 stringFormat function (str, a ...

  9. 一步步开发自己的博客 .NET版 剧终篇(6、响应式布局 和 自定义样式)

    前言 这次开发的博客主要功能或特点:    第一:可以兼容各终端,特别是手机端.    第二:到时会用到大量html5,炫啊.    第三:导入博客园的精华文章,并做分类.(不要封我)    第四:做 ...

  10. ASP.NET Web API Model-ModelBinder

    ASP.NET Web API Model-ModelBinder 前言 本篇中会为大家介绍在ASP.NET Web API中ModelBinder的绑定原理以及涉及到的一些对象模型,还有简单的Mod ...